1. ホーム
  2. linux

[解決済み] Linux/Unix でプロセスが実行されているかどうかを判断するコマンドは?

2022-12-04 12:09:09

質問

特定のプロセスが実行されているかどうかを判断する、プラットフォームに依存しない (Linux/Unix|OSX) シェル/bash コマンドが必要です。 mysqld , httpd ... これを行うための最も簡単な方法/コマンドは何ですか?

どのように解決するのですか?

一方 pidofpgrep は、何が実行されているかを判断するための素晴らしいツールですが、残念ながら、どちらも一部のオペレーティングシステムでは使用できません。確実なフェイルセーフは、以下を使用することでしょう。 ps cax | grep command

Gentoo Linuxでの出力です。

14484 ?        S 0:00 apache2
14667 ?        S 0:00 apache2
19620 ?        Sl 0:00 apache2
21132 ?        Ss 0:04 apache2

OS Xでの出力です。

42582 ??  Z 0:00.00 (smbclient)
46529 ??  Z 0:00.00 (smbclient)
46539 ??  Z 0:00.00 (smbclient)
46547 ??  Z 0:00.00 (smbclient)
46586 ??  Z 0:00.00 (smbclient)
46594 ??  Z 0:00.00 (smbclient)

LinuxでもOS Xでも、grepは終了コードを返すので、プロセスが見つかったかどうか簡単にチェックできます。

#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
  echo "Process is running."
else
  echo "Process is not running."
fi


さらに、もしPIDのリストが欲しいのであれば、それらも簡単にgrepすることができます。

ps cax | grep httpd | grep -o '^[ ]*[0-9]*'.

LinuxとOS Xで出力が同じになるもの。

3519 3521 3523 3524

の出力は空文字列であり、この方法は実行されていないプロセスに対して安全である。

echo 
ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'

この方法は、単純な空文字列のテストを書き、その後、発見されたPIDを繰り返し実行するのに適しています。

#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
  echo "Process not running." 1>&2
  exit 1
else
  for PID in $PIDS; do
    echo $PID
  done
fi

実行権限(chmod +x running)でファイル("running"という名前)に保存して、パラメータをつけて実行するとテストできます。 ./running "httpd"

#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
  echo "Process is running."
else
  echo "Process is not running."
fi


警告!!!

の出力を単にパースしているだけであることに留意してください。 ps ax の出力を単に解析しているに過ぎないということに留意してください。 つまり、Linux の出力に見られるように、単にプロセスにマッチするだけでなく、 そのプログラムに渡された引数にもマッチしているのです。この方法を使うときはできるだけ具体的にすることを強くお勧めします (たとえば ./running "mysql" は 'mysqld' プロセスにもマッチします)。私は which を使って、可能な限りフルパスでチェックすることを強くお勧めします。


リファレンスです。

http://linux.about.com/od/commands/l/blcmdl1_ps.htm

http://linux.about.com/od/commands/l/blcmdl1_grep.htm