Linux bash nohup + for for循环挂起

Linux bash nohup + background in a for loop hang

本问题已经有最佳答案,请猛点这里访问。

早上好!尝试在多个服务器上启动一个脚本(不带hup),并使其在后台运行。

直接在每台服务器上输入时,命令(由我的供应商提供)按预期运行(python脚本会抓取日志文件并通过udp将相关信息发送到另一台服务器):

1
  nohup tail -f /log/log.log | python /test/deliver.py > /dev/null 2>&1 &

但是,当放入for循环以访问多个服务器时,必须在每个服务器之间按ctrl-c以保持循环运行。

如有可能,请协助:

1
for i in `cat /etc/hosts`; do ssh $i nohup tail -f /log/log.log | python /test/deliver.py > /dev/null 2>&1 &; done

解决方案(感谢大家的帮助):

1
ssh -f user@host"cd /whereever; nohup ./whatever > /dev/null 2>&1 &"

必须将-f与双引号结合使用,如下所述:

让ssh在目标计算机的后台执行命令


就像EtanReisner已经在评论中指出的那样,您需要远程运行整个命令。此外,您还需要从ssh命令行中分离标准输入。

最后,for循环的形式不好;使用while从面向行的输入文件中读取。

1
2
3
4
while read -r host; do
    ssh"$host" 'nohup tail -f /log/log.log |
        python /test/deliver.py > /dev/null 2>&1 &'
</dev/null
done </etc/hosts

(尽管在我见过的机器上,/etc/hosts的格式并不适合这种处理。也许只读第一个字段并丢弃其他字段?这很容易;while read -r host _; do…)


我对此没有任何问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ for i in {1..5}; do ssh -i me@ip nohup sleep 10 >/dev/null 2>&1 &
 => done
[7] 34057
[8] 34058
[9] 34059
[10] 34060
[11] 34061
$ #
[7]   Done                        
[8]   Done                        
[9]   Done                        
[10]   Done                        
[11]   Done