后台作业不断停止

Red*_*ket 9 command-line jobs background-process

我在 RHEL6 bash 提示符下看到一些奇怪的行为。我经常喜欢执行看起来像……的命令行。

$ ./myscript > junk 2>&1
Run Code Online (Sandbox Code Playgroud)

...然后点击 ^Z 然后执行 ...

$ bg
$ tail -f junk
blah blah blah blah
blah blah blah blah
Run Code Online (Sandbox Code Playgroud)

但是今天出于某种原因,我看到我的工作保持“停止”状态,而不是“运行”状态。

$ uname -a
Linux myhost 2.6.18-371.11.1.el5 #1 SMP Mon Jun 30 04:51:39 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
$ ./myscript.sh > output-07-JUL-16.txt 2>&1
^Z
[1]+  Stopped                 ./myscript.sh > output-07-JUL-16.txt 2>&1
$ bg
[1]+ ./myscript.sh > output-07-JUL-16.txt 2>&1 &
$ jobs
[1]+  Stopped                 ./myscript.sh > output-07-JUL-16.txt 2>&1
$ jobs
[1]+  Stopped                 ./myscript.sh > output-07-JUL-16.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

我正在运行的脚本没什么异国情调......

#!/bin/sh

count=`wc -l hostlist`
total=1
for i in `grep -v "^#" hostlist`
do
    echo "Doing $total or $count $i"
    sudo scp -q access.sh $i:/tmp
    sudo ssh -q $i /tmp/access.sh
    sleep 1
    total=`expr $total + 1`
done
Run Code Online (Sandbox Code Playgroud)

Mar*_*ick 15

$ bg
[1]+ ./myscript.sh > output-07-JUL-16.txt 2>&1 &
$ jobs
[1]+  Stopped                 ./myscript.sh > output-07-JUL-16.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

运行jobs -l将显示有关后台作业的更多详细信息。就您的 shell 脚本而言,它将显示如下内容,其中揭示了作业停止的原因:

[1]+  4274 Stopped (tty input)     ./myscript.sh > output-07-JUL-16.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

脚本中的某些内容正在尝试从终端读取。当后台作业尝试从其控制终端读取时,它会收到一个SIGTTIN信号并停止。(只有前台作业可以从控制终端读取。)

原因:在你的脚本中,你有

sudo ssh -q $i /tmp/access.sh
Run Code Online (Sandbox Code Playgroud)

默认情况下 ssh 将尝试从其标准输入读取。你可以给 ssh 一个-n选项,告诉它不要从标准输入中读取。

sudo ssh -n -q $i /tmp/access.sh
Run Code Online (Sandbox Code Playgroud)