web-dev-qa-db-ja.com

バックグラウンドジョブが停止し続ける

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
7
Red Cricket
$ 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
9
Mark Plotnick