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)