バックグラウンドの複雑なタスクを強制的に終了させますか?

バックグラウンドの複雑なタスクを強制的に終了させますか?

私はよく次のような単純な監視タスクを実行します。

(sleep 600 && ls -lh /path/to/files)&

プロセス自体を途中でバックグラウンド解除することは可能ですか? たとえば、ジョブ ID を$jobid(または同様のもの) に取得し、終了時に?sleepを実行します。fg $jobid

これには、より複雑な bash-fu が必要になる可能性があることは承知していますが、解決策があれば教えてください (特に、fg他の対話型プロセスが実行されていない場合にのみ実行できる場合)。

答え1

非対話型スクリプトでは、ジョブ制御はデフォルトでオフになっていますが、set -mまたは を使用して有効にすることができますset -o monitor。次にスクリプトの例を示します。

# turn on job control
set -o monitor

# start a background task
( sleep 10 && echo "slept 10 seconds" ) &

# do something else
sleep 5
echo "slept 5 seconds"

# bring the background task into the foreground
fg

echo "done"

bash -x script.shトレース ( )付きで実行した場合の出力は次のとおりです。

+ set -o monitor
+ sleep 5
+ sleep 10
+ echo 'slept 5 seconds'
slept 5 seconds
+ fg
( sleep 10 && echo "slept 10 seconds" )
+ echo 'slept 10 seconds'
slept 10 seconds
+ echo done
done

関連情報