Bashスクリプトのプロセス名を使用して、Mac OS X上のプロセスが実行されているかどうかをどのように確認しますか?
プロセスが停止した場合はプロセスを再開し、実行中の場合は何もしないBashスクリプトを記述しようとしています。
これを解析する:
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
への正規表現でその問題が解決します。
より短い解決策:
if pgrep $PROCESS_NAME; then
echo 'Running';
fi
説明:
pgrep
は、実行中の$PROCESS_NAME
に一致するプロセスが存在する場合は0で終了し、それ以外の場合は1で存在します。if
はpgrep
の終了コードをチェックし、終了コードが行く限り、0は成功です。
もう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インストーラーのスクリプトから引き出しました。
この簡単なコマンドでうまくいきます。プロセス名を囲む角括弧は、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}')"
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
私の端末からのサンプル出力(もちろん、ユーザーとホスト名を打ち出します):
user@localhost:~$ kill -0 782 # This was my old, stale SSH Agent.
bash: kill: (782) - No such process
user@localhost:~$ echo $?
1
user@localhost:~$ kill -0 813 # This is my new SSH agent, I only just created.
user@localhost:~$ echo $?
0
-0はアプリケーションによって処理されるシグナルを送信しないため、kill -0からの戻りコードは常に、プロセスが実行されているかどうかを確認する安全な方法になります。アプリケーションを強制終了することはありません。「kill」は、通常、アプリケーションを停止するために使用されるため、「kill」とのみ呼ばれます。
ソースで使用するインターフェースを見ると、実際にプロセステーブルと直接対話しており(psからロードされた可能性のある出力をgrepしない)、アプリケーションに信号を送信しているだけです。一部の信号は、アプリケーションをシャットダウンまたは停止する必要があることを示し、他の信号は、サービスを再起動するか、構成を再読み取りするか、または最近ローテーションされたログファイルにファイル記述子を再度開くよう指示します。 「kill」と「killall」でできることはたくさんありますが、アプリケーションが終了することはありません。アプリケーションにシグナルを送信するために定期的に使用されます。
上記のキラーな答えについてコメントする評判はありませんが、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
ネットで見つかった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`
確かに!
openBSDおよびDarwin(Mac OS X)のpgrep、pkillおよびpfind
http://proctools.sourceforge.net
(MacPorts:port info proctoolsからも利用できます)
pidof by nightproductions.net
おそらく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と同じディレクトリにあると想定しています。
macにはpidofがありますか? ...
if pidof $processname >/dev/null ; then echo $processname is running ; fi