我有一堆脚本用于在多个服务器上启动类似的进程。我想将它们缩减为一个名为“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
答案 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更改为无缓冲。