pidofとpgrepの動作が異なるのはなぜですか?


8

私は/etc/init.d/myserviceこのようなサービスを初期化するためのinitスクリプトを持っています:

...
start() {
  ...
  daemon /usr/sbin/myservice
  ...
}

stop() {
  ...
  pgrep myservice
  pidof myservice
  ps -ef | grep myservice
  ...
}

そして、私がサービスを停止しようとすると、これは出力です:

10000 10001
10000
root      10000     1  0 09:52 ?        00:00:02 /usr/sbin/myservice
root      9791   9788  0 10:06 pts/1    00:00:00 /bin/sh /sbin/service myservice stop
root      10001  9791  1 10:06 pts/1    00:00:00 /bin/sh /etc/init.d/myservice stop 
root      9805   9796  0 10:06 pts/1    00:00:00 grep myservice

これは予想されますか?なぜpidof私が停止することをサービスの唯一の正しいPIDを返していると、pgrepサービスPIDとinitスクリプトのPIDを返していますか?pidofinitスクリプトのPIDを常に無視することを信頼できますか?

回答:


7

pidof =実行中のプログラムのプロセスIDを見つける

Pidofは、指定されたプログラムのプロセスID(pid)を見つけます。これらのIDを標準出力に出力します。このプログラムは、特にシステムにrc構造のようなSystem-Vがある場合に、実行レベルの変更スクリプトで使用される一部のシステムにあります。

sysadmin@codewarden:~$ pidof apache2
5098 5095 5094 5092

pgrep =名前やその他の属性に基づいてプロセスを検索またはシグナルで通知します。pgrepは現在実行中のプロセスを調べ、選択基準に一致するプロセスIDをリストします。

sysadmin@codewarden:~$ pgrep apache2
5092
5094
5095
5098

pgrep、(p)=プロセス、grep= grepは一致する行を出力します

pgrep&pidofについてもっと知りたいですか?ターミナルで実行するだけ

# man pidof
# man pgrep

1
ああ、それがプログラムがであるので、pidof戻らないのはなぜですか?10001sh
ピゲイラス14

はい、そうです
バビン・ロンストン14

0

に依存すべきではないと思いますpidof。プログラムが失敗する可能性があります。supervisordプログラムの簡単な例:

% cuonglm at ~
% ps -ef | grep supervisord
root      8512     1  0 16:53 ?        00:00:00 /usr/bin/python /usr/bin/supervisord
cuonglm   8584  7688  0 17:00 pts/0    00:00:00 grep --color=auto supervisord
% cuonglm at ~
% pidof supervisord
% cuonglm at ~
% 

ご覧のとおり、これsupervisordは実際にはpythonインタープリターによって呼び出され、pidof失敗します。

#! /usr/bin/python                                                            
# EASY-INSTALL-ENTRY-SCRIPT: 'supervisor==3.0a8','console_scripts','supervisord'
__requires__ = 'supervisor==3.0a8'                                            
import sys                                                                    
from pkg_resources import load_entry_point                                    

if __name__ == '__main__':                                                    
    sys.exit(                                                                 
        load_entry_point('supervisor==3.0a8', 'console_scripts', 'supervisord')()
    )

しかし、この場合、私はそれに頼ることはできますか?、プログラムの実行にインタープリターを使用していません(実行可能バイナリです)。
Pigueiras、2014

もちろん。しかし、良い方法は使用だと思いますkillproc。機能で使用daemonしているのに、なぜこれを使用しないのstartですか?
cuonglm 2014

プロセスの子を殺すためにPIDを取得したいのでkillproc、プロセス自体を殺すために使用していました。
Pigueiras、2014

なぜあなたはそれをしなければならないのですか?あなたが殺した場合parent process、それchild processも死んでしまいます。
cuonglm 2014

いいえ、私はそうは思わない:stackoverflow.com/questions/8533377/...
Pigueiras

0

オプションpidofを含めない限り、コマンドはスクリプトを無視し-xます。また、次のように、pidofコマンドに完全パスを含めるのが最も安全です。

killme=$(pidof -x /usr/bin/supervisord)
      *instead of*
killme=$(pidof -x supervisord)

これにより、他のプロセスと一致する可能性が最小限に抑えられます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.