调用通过ssh创建子进程的Python脚本挂起

时间:2011-09-27 15:35:21

标签: python ssh subprocess

我有一堆脚本用于在多个服务器上启动类似的进程。我想将它们缩减为一个名为“START”的Python脚本,但是当它在ssh上运行时会发生一些奇怪的事情。

$ ./START APP_A按预期工作:APP_A已启动并开始执行其操作。控制立即返回到控制台(在APP_A终止之前)。

$ ssh localhost /path_to/START APP_A有点工作:APP_A已启动并开始执行其操作,但是在APP_A终止之后,ssh不会向屏幕输出任何输出或将控件返回到控制台。

我认为这是信号或文件句柄的问题,但我不知所措。这是Popen的电话,似乎造成了麻烦:

sub = subprocess.Popen(shlex.split(cmd), stdout=open(file_out, 'a+'), stderr=subprocess.STDOUT, close_fds=True)
print 'New PID:', sub.pid

我在RHEL上使用Python 2.4.3。

修改 包装Python脚本似乎有效:

DIR="$( cd "$( dirname "$0" )" && pwd )"
pushd $DIR >> /dev/null
./START $1 &
popd >> /dev/null

3 个答案:

答案 0 :(得分:0)

不要使用shlex与子进程一起调用。 It doesn't do what you expect。相反,给子进程一个命令的Python列表,比如

subprocess.Popen(['/some/program', 'arg1', 'arg2', 'arg3'])

答案 1 :(得分:0)

当你这样做时:

ssh some_host remote_command remote_cmd_param

然后,在remote_command完成之前,ssh不会返回控制是正常的。如果您不想要,则需要将其发送到后台,最后添加&

ssh将remote_command的stdout重定向到其(本地)标准输出。如果您没有看到任何输出,则可能是因为remote_command没有将任何设置为stdout,而是尝试将其发送到控制台。这就是你不能做的原因:

ssh remote_host mc # or any other command using terminal

答案 2 :(得分:0)

你应该把它放在START_APP_A

nohup /path/to/APP_A >/path/to/log 2>&1 </dev/null &

然后它会工作,APP_A的所有输出都会进入一个日志文件,您可以在需要时进行检查。

请注意,如果您需要在APP_A运行时检查此输出,则需要更改APP_A以便在打印后刷新stdout,或者将stdout更改为无缓冲。