RHEL6 bashプロンプトで奇妙な動作が見られます。私はしばしば次のようなコマンドラインを実行したい...
$ ./myscript > junk 2>&1
...次に^ 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
$ 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
を実行すると、次のようなメッセージが表示され、ジョブが停止した理由が明確になります。
[1]+ 4274 Stopped (tty input) ./myscript.sh > output-07-JUL-16.txt 2>&1
スクリプトの何かがターミナルから読み取ろうとしています。バックグラウンドジョブが制御端末から読み取ろうとすると、SIGTTIN
シグナルを受信して停止します。 (制御端末から読み取ることができるのは、フォアグラウンドジョブのみです。)
原因:スクリプトには、
Sudo ssh -q $i /tmp/access.sh
デフォルトでは、sshはそのstdinから読み取ろうとします。 sshに-n
オプションを指定して、stdinから読み取らないように指示できます。
Sudo ssh -n -q $i /tmp/access.sh