在某些主机上使用Fabric将命令放入后台无效

16 投票
1 回答
6514 浏览
提问于 2025-04-17 07:48

为了测试,我在用普通的ssh命令行工具运行以下命令:

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

这个命令在我所有的主机上都能正常工作:它在后台创建了一个睡眠(sleep)进程,而ssh命令会立即完成。

我想在Python中使用Fabric实现这个功能。最后我调用了一个run命令。Fabric的日志显示如下:

[user@host] run: nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &

这正是我所期待的。但是如果我检查一下我主机上正在运行的进程,发现sleep 100并不在其中。更糟糕的是:这个问题只在我的某些主机上出现。

我还添加了一些信息,通过在Fabric要运行的命令后面加上"\necho $!"来显示创建了什么进程。报告显示如下:

[user@host] run: nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &
echo $!
[user@host] out: 30935

我现在不知道该怎么调试这个问题,因为Fabric报告说进程已经创建,但我在另一端看不到任何进程在运行。系统日志显示一个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在后台运行命令时有一些问题,但这似乎不是我的问题。Fabric、ssh或后台进程还有其他问题吗?

编辑

我在所有系统上安装了dtach。Ubuntu 8.04中打包的版本太旧,无法通过ssh调用dtach -n(终端问题),所以我不得不下载并编译dtach的源代码。完成后,我能够像这样使用Fabric运行我的命令:

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

这个在所有主机上都能正常工作。但这并不符合我的场景,因为:

  • dtach创建了两个进程:一个是dtach本身,另一个是正在运行的进程。
  • 我无法获取正在启动的进程的进程ID(pid)。

1 个回答

25

你可能遇到了那个著名的 Fabric 问题 #395。解决这个问题最简单的方法就是在运行你的任务时,把 pty=False 加上。

撰写回答