使用Fabric在后台输入命令在某些主机上不起作用

dan*_*ast 16 python ssh fabric

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

ssh user@host "nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &"
Run Code Online (Sandbox Code Playgroud)

这在我的所有主机中都按预期工作:在后台创建一个睡眠过程,并且ssh立即完成.

我正在尝试使用Fabric在python中实现此功能.我最后run打电话了.这是Fabric日志记录报告的内容:

[user@host] run: nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &
Run Code Online (Sandbox Code Playgroud)

这正是我所期待的.但是,如果我检查在我的主机中运行的进程,sleep 100则不是其中之一.更糟糕的是:问题只发生在我的一些主机上.

我还添加了一些信息,通过添加"\necho $!"来显示已创建的进程.要由Fabric运行的命令.这是报道的内容:

[user@host] run: nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &
echo $!
[user@host] out: 30935
Run Code Online (Sandbox Code Playgroud)

我没有关于如何调试它的想法,因为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
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式增加ssh守护程序生成的日志记录量,这样我至少可以看到通过ssh请求的命令吗?

我知道Fabric在后台运行命令时遇到了一些问题,但这似乎不是我的问题.Fabric/ssh /后台进程可能还有其他问题吗?

编辑

我已经安装dtach在我的所有系统上.在Ubuntu 8.04中打包的版本太旧了,不允许调用dtach -nssh(终端问题),所以我不得不下载并编译dtach源代码.在这之后,我能够使用Fabric运行我的命令:

[user @ host]运行:dtach -n/tmp/Y sleep 100 >>/tmp/xxx 2>&1

这在所有主机中都能正常工作.但这不符合我的情况,因为:

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

Yuv*_*dam 25

你可能碰到臭名昭着的面料问题#395.这些问题的简单解决方法是运行您的任务pty=False.

  • 你可以跟进这个问题,这看起来像一个ssh bug,而不是一个结构bug.你也可以提出一个有用的答案;) (2认同)
  • 我遇到了同样的问题,只要在运行命令之前没有'with cd('SomeDir')',这个解决方案就会有所帮助.虽然可以通过前置目录简单地修复,但仍然想知道为什么. (2认同)