プロセス関連で少しどうやるかわからなくなった。Forkしてプロセスを生むのはいいんだけど、まとめてpython上からどうやって殺すんだろうとか。以下にちょっとまとめる。
特定のプロセスをキルする(Kill process )
# プロセス削除
os.kill( pid, signal.SIGKILL )
# プロセスツリーの削除(親プロセスが生んだ子も全て削除)
os.killpg( os.getpgid(pid), signal.SIGKILL )
#os.getpgid でプロセスツリーのRootのIDが取得できる。
プロセスの作成
# フォークする(作成)
os.fork() # プロセスの生成。
# プロセスが実行が終わるまで待機する。
os.waitpid( pid, 0 )
プロセスが外部コマンドを実行
#コマンドの実行
os.system( 'python doit.py' )
Subprocess
os.systemは実行だけならいい。しかし、標準出力なども捌きたい場合はこちらを使った方が便利。
osモジュールにもpopenとかpopen2とかあるけど、現在は全てSubprocessで統一が図られようとしている。だから、やっぱりこっちを覚えよう
popenの使い方は以下のとおり。
p = subprocess.Popen( 'ls', stdin=subprocess.PIPE,stdout=subprocess.PIPE, close_fds=True, shell=True)
取得した後は、stdout, stdinへは次のようにアクセスできる。
p.stdout
p.stdin
上記二つともファイルオブジェクトで、中身を見たいときは、例えばp.stdoutの場合、
for line in p.stdout.readlines():
print line
などとすればいい。
以下は具体的な使い方(例:maishoku_forwadというプロセス名を削除する)
ps = subprocess.Popen( 'ps aux | grep maishoku_forward', stdin=subprocess.PIPE,stdout=subprocess.PIPE, close_fds=True, shell=True).stdout
for line in ps.readlines():
if 'grep' in line: continue # grepが含まれていたら無視
pid = line.strip().split(' ')[ 1 ] # pidは二番目に列挙されているため
try:
os.killpg( os.getpgid(int(pid)), signal.SIGKILL ) # プロセスツリーごと削除
except:
pass # 一応例外処理を入れておく。
参考
http://www.python.jp/doc/nightly/library/subprocess.html
株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house