Linux bash nohup + for for循环挂起

时间:2015-11-16 16:10:34

标签: bash loops for-loop background nohup

早上好!尝试在多个服务器上启动一个脚本w / nohup并让它在后台运行。

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

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

但是,当放入for循环到达许多服务器时,我必须在每个服务器之间按Ctrl-C以保持循环。

请尽可能提供帮助:

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

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

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

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

Getting ssh to execute a command in the background on target machine

2 个答案:

答案 0 :(得分:1)

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

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

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 :(得分:0)

我对此没有任何问题:

$ 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