【问题标题】:while(True) loop breaks SSH scriptwhile(True) 循环中断 SSH 脚本
【发布时间】:2012-07-13 12:54:27
【问题描述】:

我正在使用自动化的 SSH 脚本通过 SSH 将硬件测试复制/运行/记录到几台计算机上,除了一件事之外,一切正常。测试文件应该每 30 分钟无限期地运行一次并收集数据,然后将其写入文件直到被杀死。由于缺乏更好的例子:

注意:这些文件都不是实际代码。我没有在我面前复制它。

文件.py:

#!/usr/bin/env python
import os

idleUsage = []
sleepTime = 1800

while(True):
    holder = os.popen('mpstat | awk \'{printf("%s\n", $9)}\'')
    idleUsage.append(100.0 - float(holder[1]))

    f = open("output.log", 'w')
    f.write(%idleUsage)
    f.close()

    sleep(sleepTime)

自动-ssh.sh:

#!/bin/bash

autossh uname1 password1 ip1 command <----gets stuck after ssh runs
autossh uname2 password2 ip2 command
autossh uname3 password2 ip3 command

毫无疑问,它会卡在运行命令上。我已经尝试过“命令&”以及在整行代码的末尾放置一个&符号。有大佬给点建议吗?

【问题讨论】:

  • 我认为你需要做os.system("sar | grep kb") ...不确定,但我认为那不是有效的python行...
  • 这看起来不像 Python 语法。
  • 我知道这是不正确的语法,但这只是一个示例,甚至在代码中都没有。我担心的是在不停止我的 auto-ssh 脚本的情况下运行 while 循环。
  • 那里。我修好了一些。我很确定 SSH 的问题而不是 python 代码本身的问题。

标签: python bash ssh while-loop


【解决方案1】:

那么,您的 shell 脚本通过 ssh 连接到远程机器并运行一个无休止的 python 命令,而您希望该 ssh 连接进入后台?

#!/bin/sh
ssh thingie 1 > out.1 &
ssh thingie 2 > out.2 &
ssh thingie 3 > out.3 &
wait

这将在后台启动三个 ssh 命令记录到单个文件,然后脚本将等待它们全部退出(wait,如果没有给出 pid 作为参数,则等待所有子进程退出) .如果您终止脚本,子 ssh 进程也应该终止。我不确定这是否是您要问的,但也许它有帮助? :)

【讨论】:

    【解决方案2】:

    不确定您当前的上下文,但我建议您使用subprocess

    from subprocess import Popen
    
    p1 = Popen(["sar"], stdout=PIPE)
    p2 = Popen(["grep", "kb"], stdin=p1.stdout, stdout=PIPE)
    p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
    output = p2.communicate()[0]
    

    【讨论】:

    • 我会尝试一下。截至目前,我找到了一个临时解决方案,该脚本杀死所有 SSHD,然后在进入 while true 循环之前启动 SSHD 备份。
    猜你喜欢
    • 2016-12-03
    • 2012-03-26
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多