Bashスクリプトから手動でPIDファイルを書き込む


10

実行時間の長いプログラムを実行し、プログラムのプロセスIDを別のファイルに保存するBashスクリプトを作成するにはどうすればよいですか?

のようなものが欲しい

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

ただし、これを正確に実行するとpsツールの終了後に実行されます

作成されたプロセスのプロセスIDを取得する方法はありますか?


2
execはforkしないため、サンプルコードは機能しません。したがって、シェルプロセスはプロセスに置き換えられlong_running_toolます。その結果、execが戻ることはなく、次の行に到達することはありません。参照してくださいhelp execexecve(2)
Etienne Dechamps、2011年

@ e-t172指摘いただきありがとうございます。次に「exec」を削除します。
DerMike、2011年

回答:


12

「&」を使用してバックグラウンドでプロセスを簡単に実行し、「$!」を使用してバックグラウンドプロセスのPIDを取得できます。

#!/bin/bash
long_running_tool &
echo $! > pid_file

次に、オプションで$待ちます!プロセスの実行が完了するまでシェルをブロックする場合。


1
更新:fgを使用すると、「fg:21:job(null)not created under job control」が表示され、スクリプトがブロックされません。ごめんなさい。
DerMike、2011年

「待って!」fgと同様の効果があるはずですが、実際にはスクリプトで機能します。投稿する前にチェックしておくべきだったと思います。>。>私の悪い。
Jeremy Sturdivant、2011年

9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

前述のように、PIDを保持しまま、指定したプログラムにexec 置き換え ます。bash

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