出于测试目的,我使用普通的ssh命令行工具运行以下命令:
ssh user@host "nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &"
这在我的所有主机中都按预期工作:在后台创建一个睡眠过程,ssh立即完成。
我正在尝试使用Fabric在python中实现此功能。我最终做了run
电话。这是Fabric日志记录报告的内容:
[user@host] run: nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &
这正是我所期待的。但是,如果我检查主机中正在运行的进程,sleep 100
不是其中之一。更糟糕的是:问题只发生在我的一些主机上。
我还添加了一些信息,通过附加“\ necho $!”来显示已创建的进程。要由Fabric运行的命令。这是报道的内容:
[user@host] run: nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &
echo $!
[user@host] out: 30935
我对如何调试这个问题的想法不足,因为Fabric报告已经创建了该进程,但我发现没有进程在另一端运行。 syslog报告正在打开和关闭ssh会话:
Dec 6 09:12:09 host sshd[2835]: Accepted publickey for user from 67.133.172.14 port 37732 ssh2
Dec 6 09:12:09 host sshd[2838]: pam_unix(sshd:session): session opened for user user by (uid=0)
Dec 6 09:12:10 host sshd[2838]: pam_unix(sshd:session): session closed for user user
我可以以某种方式增加ssh守护程序正在生成的日志记录量,这样我至少可以看到通过ssh请求的命令吗?
我知道Fabric在background中运行命令存在一些问题,但这似乎不是我的问题。 Fabric / ssh /后台进程可能存在其他问题吗?
我在所有系统上安装了dtach
。在Ubuntu 8.04中打包的版本太旧了,不允许在ssh上调用dtach -n
(终端问题),所以我不得不下载并编译dtach sources。在这之后,我能够像Fabric一样运行我的命令:
[user @ host] run:dtach -n / tmp / Y sleep 100&gt;&gt; / tmp / xxx 2&gt;&amp; 1
这适用于所有主机。但这不符合我的情况,因为: