Bashプロンプトで次のコマンドを実行すると:
(for i in {1..100}; do echo $i; sleep 1; done) &
計算が開始され、すぐにプロンプトに戻ります。作業を続けることはできますが、毎秒私が作業している項目の上に新しい数字が印刷されます。ジョブが表示されるjobs
か、期待どおりに機能しますfg
。kill
このコマンドを次のスクリプトに移動すると、次のようになりますtest.sh
。
#!/usr/bin/bash
(for i in {1..100}; do echo $i; sleep 1; done) &
を実行すると./test.sh
同じことが起こりますが、ジョブはもう来ず、jobs
これ以上できませんfg
。 2番目のアクションが最初のアクションとまったく異なる理由は何ですか?PIDを見つけて終了せずに2番目のアクションをどのように制御できますか?
ベストアンサー1
$!
この目的のためにのみ設定されたPIDを追跡する必要があります。例えば、
#!/usr/bin/bash
(sleep 30; echo "slept for 30 seconds") &
sleeping_pid=$!
# do something
kill $sleeping_pid # or you can wait on it, or...
これは、$!
最近開始されたバックグラウンド操作です。したがって、上書きされる傾向があるので、すぐに別の変数にコピーします。