特定のプロセスを既に実行中かどうかを確認したい。
このQ&A を参照しました。
しかし、特定の解決策は得られませんでした。私が試した例は次のとおりです。abc.sh
ファイルを作成し、sh abc.sh &
などのバックグラウンドでこのスクリプトを実行しました。
これで、このファイルはバックグラウンドで実行され、ps aux | grep "abc"
コマンドを実行します。
このコマンドの出力は次のとおりです。
prakash 3594 0.0 0.0 4388 820 pts/0 S+ 16:44 0:00 grep --color=auto abc
その後、abc.sh
実行中のスクリプトを停止し、同じコマンドps aux | grep "abc"
コマンドを実行します。
しかし、私は次のような同じ出力を取得しています:
prakash 3594 0.0 0.0 4388 820 pts/0 S+ 16:44 0:00 grep --color=auto abc
プロセスが実行されているかどうかを確認する他の方法はありますか?
すべてのプロセスは、ps aux
の出力にリストされます。実行中、スリープ中、ゾンビ、停止のいずれでもかまいません。
ただし、あなたの場合、sh abc.sh
を使用してプロセスを実行したため、sh
はabc.sh
ではなく、実行中のアプリケーション(シェル)です。したがって、ps aux
にはプロセスabc.sh
が含まれません。これは、grep
が結果を生成できなかったためです。
したがって、正しい使用方法は次のとおりです。
ps aux | grep sh
これにより、ps aux
の出力に文字列sh
が含まれる、実行中の他のプロセスが返される場合もあります。
ps aux
の出力のSTAT
がR
である場合、プロセスは「実行中」になることに注意してください。それ以外の場合は、実行中のプロセスを確認するコマンドを実行したインスタンスで実行されていません。さまざまなプロセス状態は、psのmanページにあります。
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped, either by a job control signal or because it is being traced
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
top
コマンドを実行して、プロセスが実行中かスリープ中か、およびCPUの量RAMが消費していることを確認することもできます。 (これにより、プロセスがsh
として再びリストされます)。
ただし、プロセスをabc.sh
としてリストする場合は、実行しているスクリプトの最初の行が次のようになっている必要があります。
#!/bin/sh
シェルは、スクリプトの実行に使用するアプリケーションを認識し(この場合はsh、bashの場合は#!/bin/bash
に変更)、次に以下を使用してプロセスに実行許可を与えます。
chmod +x /path/to/abc.sh
/path/to/
をabc.sh
ファイルの場所に置き換えてからabc.sh
を実行します
/path/to/abc.sh
再び/path/to/
をabc.sh
ファイルの場所に置き換えます。
grep
での私の問題は、それが全行パーサーであることです。この例では、「abc」を検索していますが、grep
のインスタンスをプルバックしています(「abc」を検索しています)。少し円形。あなたはそれを除外することができますが、私はそれらすべてを少しひねくれています。
私はawk
にちょっとした苦労を求めます。
ps aux | awk '$12=="abc.sh"'
awk
は、空白に基づいて行をフィールドに分割します(デフォルト)。フィールド$ 11 +はコマンド列なので、コマンドが「sh abc.sh ...」の場合、$11
はsh
になり、$12
はabc.sh
になります。
Bashの&&
および||
演算子を使用して出力またはチェーンを制御する場合は、可能ですが、もう少し賢くする必要があります。 grep
は、何も見つからない場合にステータスコード1(技術的失敗、トリガー||
)で終了しますが、awk
は常にコード0を終了します。そうでない場合は1をスローします。
ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running
もちろん、画面への出力の書き込みに関心がある場合は、すべてawk
で実行できます。
ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
sh abc.sh &
などのプロセスがバックグラウンドで開始されているかどうかを現在のbashセッションでチェックインする正しい方法は、jobs
組み込みコマンドを使用することです。
例:
$ sh abc.sh &
[1] 6917
$ jobs
[1]+ Running sh abc.sh &
つまり、バックグラウンドで開始されたsh abc.sh
プロセスが実行されています。プロセスが終了すると、次のようなものが表示されます。
[1]+ Done sh abc.sh
バックグラウンドで実行中のプロセスがさらにある場合は、次を使用してsh abc.sh
プロセスのみに出力を制限できます。
jobs sh
詳細については、help jobs
を参照してください。
上記の方法は、bashの現在のセッションでのみ機能します。ただし、別のbashセッション(たとえば、別のターミナルウィンドウまたはタブ、またはスクリプト)にいる場合は、以下を除きます:
ps aux | grep "[s]h bin/test.sh"
以下も使用できます。
pgrep -a sh
私にはもっと簡単に思えます。入力したコマンドが出力(この場合はsh abc.sh
)に表示される場合、それはプロセスがまだ実行中であることを意味します。そうでない場合、プロセスは終了しています。
スクリプトが現在実行されている場合、ps aux
コマンドで表示する必要があります。 ps
で表示されない場合は、スクリプトの実行が現在終了している可能性があります。
このようなps
の出力は、スクリプトが現在実行されていないことを意味します。
$ ps aux | grep hm.sh
avinash 6386 0.0 0.0 15940 932 pts/16 S+ 17:34 0:00 grep --color=auto hm.sh
このように表示される場合は、スクリプトが現在実行されていることを意味します。
$ ps aux | grep hm.sh
avinash 6454 0.0 0.0 16616 1384 pts/16 S+ 17:35 0:00 /bin/bash ./hm.sh
avinash 6535 0.0 0.0 15940 932 pts/27 R+ 17:35 0:00 grep --color=auto hm.sh
それはすべてスクリプトの内容に基づいています。
たとえば、このようなスクリプトを作成する場合。実行時にメッセージHIを表示します。出力を表示するには数秒かかり、最終結果が生成された後に終了しました。
#!/bin/bash
echo "HI"
しかし、このようなスクリプトの場合、
#!/bin/bash
Sudo apt-get update
プロセスを終了させるには数分かかります。それまでの間、ps aux | grep filename
コマンドを実行すると、出力に表示されます。スクリプトが現在実行されているため。