web-dev-qa-db-ja.com

プロセスがすでに実行されているかどうかを確認する方法

特定のプロセスを既に実行中かどうかを確認したい。

この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

プロセスが実行されているかどうかを確認する他の方法はありますか?

31

すべてのプロセスは、ps auxの出力にリストされます。実行中、スリープ中、ゾンビ、停止のいずれでもかまいません。

ただし、あなたの場合、sh abc.shを使用してプロセスを実行したため、shabc.shではなく、実行中のアプリケーション(シェル)です。したがって、ps auxにはプロセスabc.shが含まれません。これは、grepが結果を生成できなかったためです。

したがって、正しい使用方法は次のとおりです。

ps aux | grep sh

これにより、ps auxの出力に文字列shが含まれる、実行中の他のプロセスが返される場合もあります。

ps auxの出力のSTATRである場合、プロセスは「実行中」になることに注意してください。それ以外の場合は、実行中のプロセスを確認するコマンドを実行したインスタンスで実行されていません。さまざまなプロセス状態は、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ファイルの場所に置き換えます。

41
jobin

grepでの私の問題は、それが全行パーサーであることです。この例では、「abc」を検索していますが、grepのインスタンスをプルバックしています(「abc」を検索しています)。少し円形。あなたはそれを除外することができますが、私はそれらすべてを少しひねくれています。

私はawkにちょっとした苦労を求めます。

ps aux | awk '$12=="abc.sh"'

awkは、空白に基づいて行をフィールドに分割します(デフォルト)。フィールド$ 11 +はコマンド列なので、コマンドが「sh abc.sh ...」の場合、$11shになり、$12abc.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"}'
6
Oli

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)に表示される場合、それはプロセスがまだ実行中であることを意味します。そうでない場合、プロセスは終了しています。

4
Radu Rădeanu

スクリプトが現在実行されている場合、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コマンドを実行すると、出力に表示されます。スクリプトが現在実行されているため。

3
Avinash Raj