多くの場合、bash
シェルスクリプトを使用して、さまざまなファイルに対して簡単なコマンドを実行します。例えば、私は次があるとbash
呼ばれるシェルスクリプト、script.sh
プログラム/コマンドを実行し、foo
3つのテキストファイルには"a.txt"
、"b.txt"
、"c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
また、それfoo $strname".txt"
が遅いと仮定すると、スクリプトの実行には長い時間がかかります(たとえば、数時間または数日)。このためnohup
、端末が閉じられたり切断されたりしても実行が継続されるように使用したいと思います。また、スクリプトをすぐにバックグラウンドに移動させたいので、&
演算子を使用します。したがって、次のコマンドを使用して呼び出しますscript.sh
。
nohup bash script.sh &
これは、スクリプトをバックグラウンドでハングアップせずに実行する場合には正常に機能しますが、何らかの理由である時点で実行を終了したいとします。これどうやってするの?
私が遭遇した問題は、を見るとtop
、にfoo
対応するものだけが見えること"a.txt"
です。そのfoo
呼び出しを終了することはできますが、foo
対応する"b.txt"
が呼び出されると、その呼び出しも終了する必要があります。for
ループで指定された数十または数百のテキストファイルの場合、すべてfoo
を1つずつ終了するのは面倒です!そのため、代わりにシェルスクリプトから発行された特定の呼び出しではなく、シェルスクリプト自体を代わりに終了する必要があります。
コマンドを入力するとき
ps -u myusername
myusername
ユーザー名はどこにあるのか、実行中のプロセスのリストを取得します。しかし、という2つの異なるプロセスIDが表示されbash
ます。これらのプロセスがあれば、どのプロセスが元の呼び出しに対応しているかを知るにはどうすればよいnohup bash script.sh &
ですか?
for s in a b c; do foo "$s".txt; done
nohup
開始したジョブを確認するためにプロセスリストを表示するまでには、もうなくなっています。ps
出力の"niceness"列を見ることができますが、ここでの回答はより便利です。