结构在执行远程 bash 脚本时挂起

fabric hangs while excuting remote bash script

我有一个名为 ssadmin.sh 的 bash 脚本,它管理另一个脚本 sscounter.sh 。 我正在使用 fabric 执行 ssadmin.sh.

没有pty=False:

def ts1():
    with settings(warn_only=True):
        run("chmod 775 %s" % 'ssadmin.sh')
        run("%s start" % 'ssadmin.sh')

sscounter.sh连启动都启动不了,但是cmd不会挂:

root@ubuntu-1404:~# /mithril/scripts/ss-bash/ssadmin.sh status
ssserver not running
sscounter.sh not running

pty=False:

def ts1():
    with settings(warn_only=True):
        run("chmod 775 %s" % 'ssadmin.sh')
        run("%s start" % 'ssadmin.sh', pty=False)



root@ubuntu-1404:~# /mithril/scripts/ss-bash/ssadmin.sh status
ssserver not running
10670 ?        S      0:00 /bin/bash /mithril/scripts/ss-bash/sscounter.sh
sscounter.sh is running

sscounter.sh 已启动,但 cmd 挂起:

E:\[Sync]\project\walbk\fab>fab ts1
[192.168.1.181] Executing task 'ts1'
[192.168.1.181] run: chmod 775 /mithril/scripts/ss-bash/ssadmin.sh
[192.168.1.181] run: /mithril/scripts/ss-bash/ssadmin.sh start
[192.168.1.181] out: stdin: is not a tty
[192.168.1.181] out:  9915 ?        S      0:00 /bin/bash /mithril/scripts/ss-bash/sscounter.sh
[192.168.1.181] out: sscounter.sh鍚姩涓?..
[192.168.1.181] out: 10670 ?        S      0:00 /bin/bash /mithril/scripts/ss-bash/sscounter.sh
[192.168.1.181] out: sscounter.sh宸插惎鍔?
[192.168.1.181] out:                 (hang at here)

1.why 织物挂起?

2.fabric pty description: http://docs.fabfile.org/en/latest/usage/interactivity.html#echoes

pty is present to echo a user’s stdin,为什么pty=Truesscounter.sh不启动?

我看了一下你的代码,因为你不需要在 sscounter.sh 中打印任何东西,有一个快速解决挂起问题的方法:将 ( $DIR/sscounter.sh ) & 更改为 [=12] =].

当您没有重定向 stdout 时,fabric 将等待它并且由于您的 sscounter.sh 不会退出 fabric 似乎挂起。

如果你 运行 ssadmin.sh(没有标准输出重定向的版本)远程像这样:ssh user@remote-host 'bash ssadmin.sh',它也会因为同样的原因挂起。否则如果你使用ssh -t user@remote-host 'bash ssadmin.sh',它不会挂起。

我认为使用带 pty=Truepty=False 的织物就像使用带和不带 -t 选项的 ssh 一样。