質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

17851閲覧

プロセス名とは何か?(pgrep)

hirhir

総合スコア11

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2017/02/07 06:51

基本的な質問で申し訳ありませんが、pgrepに引数で渡す"プロセス名"とは何でしょうか??
例えば、以下のようにpsコマンドを叩いても、コマンド名などはありますが、プロセス名は表示されないように思います。
$ ps -ef | head -1
UID PID PPID C STIME TTY TIME CMD
$

また、シェルスクリプトで二重起動防止の実装をしているのですが、pgrep $0としてもプロセスIDが取れません。。。$0で取れる"プロセス名"とpgrepの引数で渡すべき"プロセス名"は別の物なのでしょうか??

どなたかご存知の方、ご教授いただけないでしょうか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Linux前提で回答します。

  • pgrep プロセス名で指定するものは、ps -eCMD欄に出力されるものにマッチします。「タスク名」などと呼ぶこともあります。これは通常、プロセスの実行ファイルのファイル名の部分です。さらに、15文字を超える場合は16文字目以降が切り捨てられます。

  • pgrep -f プロセス名で指定するものは、ps -efCMD欄に出力されるものにマッチします。これは通常、プロセスを実行するときに指定したコマンドラインで、実行ファイル名がフルパスかどうかも指定した通りになります。ただし、これはプロセス自身が書き換えることができるので、実際にはプロセス名とは関係ないものになっている場合もあります。

bashなどでの$0の値は、後者のうち、最初の実行ファイル名の部分です。


なお、上記の「プロセス名」の仕様はOSの種類によって違います。macOSやFreeBSDなどでは「タスク名」はなく、常に後者の形式が使われます。Solarisなどでは、「タスク名」は8文字を超えると9文字目以降が切り捨てられます。このように仕様が違うため、pgrepにもOS毎に違うオプションが用意されていることがあります。

投稿2017/02/07 08:42

編集2017/02/07 09:00
ikedas

総合スコア4335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hirhir

2017/02/12 00:55

ご回答ありがとうございます。プロセス名で指定すべきは、psコマンドのCMD欄にあるものだったのですね。また、ちょうどubuntuとmacOSのpsコマンドの表示の違いで悩んでいたところだったので。助かりました。
guest

0

psコマンドはオプションによって表示項目が変わります。ps aux などとすると、/proc/[pid]/cmdline を参照するようで、これだとマッチしない可能性があります。またこの仮想ファイルはプロセス側で書き換えが可能だったりします。

psのデフォールトではプロセス名は /proc/[pid]/stat 内(/proc/[pid]/statusで人間に読みやすい形式で見ることができます)の値でしょうか(確信はありません)。あるいは/proc/[pid]/comm かもしれません。/proc を使ってる場合ですが。

pgrepもオプションによって表示が変わります。

投稿2019/07/09 10:12

編集2019/07/09 10:23
myoon

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

プロセス名は表示されない

コマンド文字列として表示されているものという意味だと思います。

$ ps -ef | head -2 UID PID PPID C STIME TTY TIME CMD root 1 0 0 16:39 ? 00:00:01 /sbin/init splash ^^^^^^^^^^^^^^^^^

実験してみるとスクリプト名をpgrepに渡しても見つけてくれました。しかし、./シェル名のようにして実行するとpgrepが見つけてくれませんでした。そこで次のように書いてみるとなんとなく動きました。$0をpgrepへ渡す前に先頭の./を除去しているだけのものです。

sh

1#!/bin/bash 2#set -v 3echo "0 = $0" 4sc="echo $0" 5sc=`$sc | sed 's/^\.\///'` 6echo "sc = $sc" 7 8#ps -ef | grep sh 9 10pid=`pgrep $sc` 11echo 'pid = ' $pid 12if [ "$$" = "$pid" ] ; then 13 echo does not exist 14else 15 echo exists 16 ps -f -p $pid 17fi 18# 起動中のテスト用のread 19read

ちなみに、Linuxの色々なディストリビューションでコマンドの仕様やシェルの仕様が微妙に違うことが多いと思いますので注意が必要ですね。上のスクリプトはUbuntuでたまたま動くように見えるという程度のものです。


なんかありそうなので探してみるとやはり記事があります。上のようなテキトーなものを作るよりこうしたものは記事を参照したほうがいいかもですねw;

シェルスクリプトの二重起動防止

記事をみるとsedなんて使ってなくてbasenameでやってます orz

投稿2017/02/07 08:10

編集2017/02/07 08:19
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hirhir

2017/02/12 00:56

二重起動防止のリンク先までいただきありがとうございます。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問