在Fabric中将命令放在后台在某些主机上不起作用

时间:2011-12-06 08:19:49

标签: python ssh fabric

出于测试目的,我使用普通的ssh命令行工具运行以下命令:

ssh user@host "nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &"

这在我的所有主机中都按预期工作:在后台创建一个睡眠过程,ss​​h立即完成。

我正在尝试使用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

这适用于所有主机。但这不符合我的情况,因为:

  • dtach创建了两个进程:一个用于dtach本身,另一个用于正在运行的进程。
  • 我无法获得正在启动的流程的pid

1 个答案:

答案 0 :(得分:25)

你可能碰到臭名昭着的Fabric issue #395。解决这些问题的最简单方法是使用pty=False运行您的任务。