我在 RHEL6 bash 提示符上看到一些奇怪的行为。我经常喜欢执行看起来像......的命令行
$ ./myscript > junk 2>&1
...然后点击Ctrl-Z然后执行...
$ bg
$ tail -f junk
blah blah blah blah
blah blah blah blah
但今天,由于某种原因,我发现我的工作仍然“停止”,而不是“运行”。
$ 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
我正在运行的脚本没什么奇怪的......
#!/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
答案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 -l
将显示有关后台作业的更多详细信息。对于您的 shell 脚本,它将显示类似以下内容,其中揭示了作业停止的原因:
[1]+ 4274 Stopped (tty input) ./myscript.sh > output-07-JUL-16.txt 2>&1
您的脚本中的某些内容正在尝试从终端读取。当后台作业尝试从其控制终端读取数据时,它会收到SIGTTIN
信号并停止。 (只有前台作业可以从控制终端读取。)
原因:在你的脚本中,你有
sudo ssh -q $i /tmp/access.sh
ssh 默认情况下会尝试从其标准输入读取。您可以为 ssh 提供-n
选项,告诉它不要从 stdin 读取。
sudo ssh -n -q $i /tmp/access.sh