web-dev-qa-db-ja.com

Macプロセスがプロセス名でBashを使用して実行されているかどうかを確認する

Bashスクリプトのプロセス名を使用して、Mac OS X上のプロセスが実行されているかどうかをどのように確認しますか?

プロセスが停止した場合はプロセスを再開し、実行中の場合は何もしないBashスクリプトを記述しようとしています。

22
Chris Redford

これを解析する:

ps aux | grep -v grep | grep -c [-i] $ProcessName

...おそらくあなたの最善の策です。

ps auxは、Jacobからのアドバイスにより(コメントで)grep -v grepによって解析されるBashスクリプト自体を含む、現在実行中のすべてのプロセスをリストし、grep -c [-i] $ProcessNameは、オプションで大文字と小文字を区別しない整数のプロセス数を返します。セバスチャンによって提案された整数の戻りで。

以下は、あなたが求めていることを実行する短いスクリプトです。

#!/bin/bash
PROCESS=myapp
number=$(ps aux | grep -v grep | grep -ci $ProcessName)

if [ $number -gt 0 ]
    then
        echo Running;
fi

EDIT:最初にgrep-iフラグを含めて、大文字と小文字を区別しません。私が試したサンプルプログラムはpythonでした。これは、Mac OS XではPythonとして実行されます。アプリケーションのケースが正確にわかっている場合は、-iは不要です。

このアプローチの利点は、それに合わせてスケーリングできることです。将来的に、たとえば、アプリケーションのfiveインスタンスが実行されていることを確認する必要がある場合、すでにカウント。唯一の注意点は、別のアプリケーションのコマンドラインにプログラムの名前がある場合、それが表示される可能性があります-巧妙な場合(そしてこれに遭遇した場合)、grepへの正規表現でその問題が解決します。

Darwinのmanページで psgrep 、および wc を調べます。

31
Jed Smith

より短い解決策:

if pgrep $PROCESS_NAME; then
    echo 'Running';
fi

説明:

pgrepは、実行中の$PROCESS_NAMEに一致するプロセスが存在する場合は0で終了し、それ以外の場合は1で存在します。
ifpgrepの終了コードをチェックし、終了コードが行く限り、0は成功です。

30
Nick Zalutskiy

もう1つの方法は、killallコマンドの-dオプションを使用する(乱用する)ことです。 -dオプションは実際にはプロセスを強制終了しませんが、代わりに何が行われるかを出力します。また、一致するプロセスが見つかった場合はステータス0で終了し、見つからない場合は1で終了します。これをまとめると:

#!/bin/bash
`/usr/bin/killall -d "$1" &> /dev/null`
let "RUNNING = ! $?"     # this simply does a boolean 'not' on the return code
echo $RUNNING

その理由を説明するために、私はもともとこの手法をiTunesインストーラーのスクリプトから引き出しました。

11
amrox

この簡単なコマンドでうまくいきます。プロセス名を囲む角括弧は、grepコマンドがプロセスリストに表示されないようにします。コンマの後にスペースがないことに注意してください。一部のUNIXシステムではpsがオプションの前にダッシュを必要とする場合があるため、いくつかの移植性の問題がある可能性があります。

ps axo pid,command | grep "[S]kype"

利点は、次のようなifステートメントで結果を使用できることです。

if [[ ! $(ps axo pid,command | grep "[i]Tunes.app") ]]; then
    open -a iTunes
fi

または、このスタイルを好む場合:

[[ ! $(ps axo pid,command | grep "[S]kype") ]] && open -a Skype  || echo "Skype is up"

別の利点は、パイプをawk '{print $ 1}'に追加することでpidを取得できることです。

echo "iTunes pid: $(ps axo pid,command | grep "[i]Tunes.app" | awk '{print $1}')"
5
Dan Gerrity

PIDで検索するか名前で検索するかによって、killallまたはkillを使用できます。

名前で:

if ! killall -s -0 $PROCESS_NAME >/dev/null 2>&1; then
  # Restart failed app, or do whatever you need to prepare for starting the app.
else
  at -f $0 +30seconds # If you don't have this on cron, you can use /usr/bin/at
fi

PID別:

if ! kill -0 $PID 2>/dev/null; then
  # Restart app, do the needful.
else
  at -f $0 +30seconds
fi

OSX Manualを見ると、異なる一連のプロセス管理コマンドが表示されます。これはLinuxカーネルではないため、プロセスを異なる方法で管理することは理にかなっています。

https://developer.Apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/killall.1.html

私の端末からのサンプル出力(もちろん、ユーザーとホスト名を打ち出します):

[email protected]:~$ kill -0 782 # This was my old, stale SSH Agent.
bash: kill: (782) - No such process
[email protected]:~$ echo $?
1

[email protected]:~$ kill -0 813 # This is my new SSH agent, I only just created.
[email protected]:~$ echo $?
0

-0はアプリケーションによって処理されるシグナルを送信しないため、kill -0からの戻りコードは常に、プロセスが実行されているかどうかを確認する安全な方法になります。アプリケーションを強制終了することはありません。「kill」は、通常、アプリケーションを停止するために使用されるため、「kill」とのみ呼ばれます。

ソースで使用するインターフェースを見ると、実際にプロセステーブルと直接対話しており(psからロードされた可能性のある出力をgrepしない)、アプリケーションに信号を送信しているだけです。一部の信号は、アプリケーションをシャットダウンまたは停止する必要があることを示し、他の信号は、サービスを再起動するか、構成を再読み取りするか、または最近ローテーションされたログファイルにファイル記述子を再度開くよう指示します。 「kill」と「killall」でできることはたくさんありますが、アプリケーションが終了することはありません。アプリケーションにシグナルを送信するために定期的に使用されます。

3
Markizano

上記のキラーな答えについてコメントする評判はありませんが、killall -sシグナルを送信せずに実行する場合:

killall -s "$PROCESSNAME" &> /dev/null
if [ $? -eq 0 ]; then
    echo "$PROCESSNAME is running"
    # if you also need the PID:
    PID=`killall -s "$PROCESSNAME" | awk '{print $3}'`
    echo "it's PID is $PID"
fi
2
Ingmar Hupp

ネットで見つかったpidofスクリプトを拡張して、正規表現(通常は部分文字列)を使用し、大文字と小文字を区別しないようにしました

#!/bin/sh
ps axc  |awk "BEGIN{ n=tolower(\"$1\")}\
    tolower(\$5) ~n {print  \$1}";

このコンテンツを使用して「pidof」という名前のスクリプトを作成し、パス、つまり次のディレクトリの1つに配置します

echo $PATH

そしてそれを実行可能にします(おそらくSudoを使用します)

chmod 755 /usr/local/bin/pidof

もちろんこのように使います

kill -9 `pidof pyth`
1
Zontar Ian

確かに!

openBSDおよびDarwin(Mac OS X)のpgrep、pkillおよびpfind

http://proctools.sourceforge.net

(MacPorts:port info proctoolsからも利用できます)

pidof by nightproductions.net

0
kusai

おそらくOPには遅すぎますが、これはこのスレッドを見つける他の人を助けるかもしれません。

上記のamroxテーマの次の変更は、OS Xでアプリケーションを再起動するのに適しています。

killall -d TextEdit &> /dev/null && killall TextEdit &> /dev/null; open -a TextEdit

次のAppleScriptを使用して、デーモンを更新および再起動します。

tell application "System Events" to set pwd to POSIX path of container of (path to me)
do Shell script "launchctl unload -w /Library/LaunchDaemons/time-test.plist; cp -f " & quoted form of pwd & "/time-test.plist /Library/LaunchDaemons; launchctl load -w /Library/LaunchDaemons/time-test.plist" with administrator privileges

元のまたは更新されたplistファイルがAppleScriptと同じディレクトリにあると想定しています。

0
Neville Hillyer

macにはpidofがありますか? ...

if pidof $processname >/dev/null ; then echo $processname is running ; fi
0
matja