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

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

ただいまの
回答率

90.53%

  • Linux

    4370questions

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

  • bash

    784questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,744

hirhir

score 3

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

Linux前提で回答します。

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

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 09:55

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

    キャンセル

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へ渡す前に先頭の./を除去しているだけのものです。

#!/bin/bash
#set -v
echo "0 = $0"
sc="echo $0"
sc=`$sc | sed 's/^\.\///'`
echo "sc = $sc"

#ps -ef | grep sh

pid=`pgrep $sc`
echo 'pid = ' $pid
if [ "$$" = "$pid" ] ; then
    echo does not exist
else
    echo exists
    ps -f -p $pid
fi
# 起動中のテスト用のread
read

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


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 09:56

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

    キャンセル

同じタグがついた質問を見る

  • Linux

    4370questions

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

  • bash

    784questions

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