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

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

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バックグラウンドジョブの詳細が表示されます。シェルスクリプトの場合、ジョブが停止した理由を示す次の内容が表示されます。

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

スクリプトのどの項目が端末から読み取ろうとしています。バックグラウンド・ジョブが制御端末からデータを読み取ろうとすると、シグナルを受信してSIGTTIN​​停止します。 (フォアグラウンドジョブのみが制御端末から読み取ることができます。)

理由:スクリプトに

sudo ssh -q $i /tmp/access.sh

ssh はデフォルトで標準入力から読み込みを試みます。-nstdinから読み取らないようにsshオプションを指定できます。

sudo ssh -n -q $i /tmp/access.sh

関連情報