質問: 基本的な質問で申し訳ありませんが、pgrepに引数で渡す"プロセス名"とは何でしょうか?? 例えば、以下のようにpsコマンドを叩いても、コマンド名などはありますが、プロセス名は表示されないように思います。 $ ps -ef | head -1 UID PID PPID C STIME TTY TIME CMD $ また、シェルスクリプトで二重起動防止の実装をしているのですが、pgrep $0としてもプロセスIDが取れません。。。$0で取れる"プロセス名"とpgrepの引数で渡すべき"プロセス名"は別の物なのでしょうか?? どなたかご存知の方、ご教授いただけないでしょうか??
回答: Linux前提で回答します。 * `pgrep プロセス名`で指定するものは、`ps -e`で`CMD`欄に出力されるものにマッチします。「タスク名」などと呼ぶこともあります。これは通常、プロセスの実行ファイルのファイル名の部分です。さらに、15文字を超える場合は16文字目以降が切り捨てられます。 * `pgrep -f プロセス名`で指定するものは、`ps -ef`で`CMD`欄に出力されるものにマッチします。これは通常、プロセスを実行するときに指定したコマンドラインで、実行ファイル名がフルパスかどうかも指定した通りになります。ただし、これはプロセス自身が書き換えることができるので、実際にはプロセス名とは関係ないものになっている場合もあります。 bashなどでの`$0`の値は、後者のうち、最初の実行ファイル名の部分です。 なお、上記の「プロセス名」の仕様はOSの種類によって違います。macOSやFreeBSDなどでは「タスク名」はなく、常に後者の形式が使われます。Solarisなどでは、「タスク名」は8文字を超えると9文字目以降が切り捨てられます。このように仕様が違うため、pgrepにもOS毎に違うオプションが用意されていることがあります。