2

擬似コードで私は次のようなことをしようとしています

if myService is running
  restart myService
else
  start myService

上記をbashスクリプトなどに変換するにはどうすればよいですか?

4

2 に答える 2

6

標準的な方法は、サービスのPIDを格納するためにPIDファイルを使用することです。次に、PIDファイルに保存されているPIDを使用して、サービスがすでに実行されているかどうかを確認できます。

ディレクトリの下にあるさまざまなスクリプトを/etc/init.d見て、それらがPIDファイルをどのように使用しているかを確認してください。また/var/run、ほとんどのLinuxシステムで、PIDファイルが保存されている場所を確認してください。

このようなことを行うことができます。これは、すべてのBourneシェルタイプのシェルに対してこれを処理する一般的な方法です。

# Does the PID file exist?

if [ -f "$PID_FILE" ]
then
    # PID File does exist. Is that process still running?
    if ps -p `cat $PID_FILE` > /dev/null 2&1
    then

       # Process is running. Do a restart
       /etc/init.d/myService restart
       cat $! > $PID_FILE
    else
       # Process isn't' running. Do a start
       /etc/init.d/myService start
       cat $! > $PID_FILE
else
   # No PID file to begin with, do a restart
   /etc/init.d/myService restart
   cat $! > $PID_FILE
fi

ただし、Linuxでは、 pgrepを利用できます。

if pgrep myService > /dev/null 2>&1
then
    restart service
else
    start service
fi

中括弧を使用しないことに注意してください。ifステートメントは、コマンドの終了ステータスに基づいて動作しますpgrep。STDOUTとSTDERRの両方を/dev/ nullに出力しているのは、それらを印刷したくないからです。pgrepコマンド自体の終了ステータスが必要です。

PGREPのマンページを読む

かなりの数のオプションがあります。たとえば、-x意図しない一致を防ぐためにを使用したい場合や-f、サービスの開始に使用される完全なコマンドラインでの一致を使用する必要がある場合があります。

于 2012-06-04T18:47:53.723 に答える
0

ps auxを実行したときにmyServiceが表示された場合は、bashでこれを実行できます(jordanmが提案したようにpgrepを使用するように編集されています)。

if [ $(pgrep myService) ]; then
    restart myService;
else
    start myService;
fi
于 2012-06-03T03:07:32.327 に答える