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


32

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

私は査読この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

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

回答:


41

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

あなたが使用してプロセスを実行したので、しかし、あなたのケースでは、sh abc.shsh実行していないアプリケーション(シェル)ですabc.sh。したがって、結果が得られなかったためps aux、プロセスは含まれません。abc.shgrep

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

ps aux | grep sh

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

の出力にas ps auxがある場合、プロセスは「実行中」になることに注意してください。それ以外の場合、実行中のプロセスを確認するコマンドを実行したインスタンスで実行されていません。さまざまなプロセス状態は、psのmanページにあります。STATR

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、#!/bin/bashbashに変更する)を認識し、次を使用してプロセスに実行許可を与えます。

chmod +x /path/to/abc.sh

交換/path/to/の場所とabc.shファイル名を指定して実行ファイルをabc.sh使用して

/path/to/abc.sh

再びファイル/path/to/の場所に置き換えabc.shます。


2
簡単な質問。STAT何であるS+の手段
プラカシュV Holkar

ただし、ps aux | grep filenameコマンドの出力から、実行中のプロセスと実行していないプロセスの違いを見つけることができます。
アビナッシュラジ

@TechGuru:プロセスがフォアグラウンドでスリープしていることを意味します。詳細については、psのマニュアルページを参照してください。
jobin

@AvinashRaj:はい、もちろんできます。
jobin

エラーが発生します:エラー、これを実行:mount -t proc proc / proc
IgorGanapolsky

7

私の問題grepは、それが行全体のパーサーだということです。あなたの例では、「abc」を検索していますが、「abc」を探しているインスタンスを引き戻していますgrep。少し円形。あなたはそれを除外することができますが、私はそれらすべてを少しひねくれています。

私はawkちょっとした問題に目を向けるでしょう。

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

awk空白に基づいて行をフィールドに分割します(デフォルト)。フィールド$ 11 +はコマンド列なので、コマンドが「sh abc.sh ...」の場合$11はにshなり$12ますabc.sh

Bash &&||演算子を使用して出力またはチェーンを制御する場合は、できますが、もう少し賢くする必要があります。何も見つからない場合はgrepステータスコード1(技術的な失敗、トリガー||)でawk終了しますが、常にコード0を終了します。

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"}'

4

バックグラウンドで開始されたプロセスなどの現在のbashセッションをチェックインする正しい方法sh abc.sh &は、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この場合)に表示される場合、それはプロセスがまだ実行中であることを意味します。そうでない場合、プロセスは終了しています。


3

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


-2
  • すべてのプロセスをチェックする場合は、「top」を使用します

  • javaで実行されるプロセスを知りたい場合は、 ps -ef | grep java

  • 他のプロセスが使用する場合、ps -ef | grep xyzまたは単に/etc/init.d xyz status

  • 以下のような任意のコードを介してIF .shその後、./xyz.sh status


1
-1これらのコマンドは特定の状況下では有用ですが、これらの状況を知らない人にとっては役に立たないでしょう。いずれの場合も、十分に説明していないか、説明が間違っています。
デビッドフォースター

-2

あなたは、単にプロセスの下のいずれかが、そのディレクトリに移動し、入力があるかどうかを確認したい場合はll -tr、あなたが見ている場合.csv.work、ファイルの末尾など、それは他にないプロセスの下を意味します。


この答えは意味がありません。ディレクトリの内容をリストしても、プロセスが実行されているかどうかはわかりません。ファイル拡張子.csvは、実行中のプロセスに関係しないコンマ区切りファイル用です。
ユーザー369450
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.