GNU/Linux >> Linux の 問題 >  >> Linux

スクリプトが終了したメッセージで突然終了しますか?

これは私のbashスクリプトです。サービスが開始されているかどうか、および一部のプロセスが期待どおりに実行されているかどうかを確認するだけです。

「終了」メッセージで突然終了します。 set -xでデバッグしてみました フラグを立てても、何が悪いのかまだわかりません。スタックオーバーフローとGoogleは、同様の問題を抱えている他の人を私に見せません。

スクリプトには755の権限があります。明らかな理由により、一部のコマンドは難読化されています。

#!/bin/bash

set -x 

DAEMON_BIN=/etc/init.d/init-god
DAEMON_BIN_START="${DAEMON_BIN} start"
DAEMON_BIN_STOP="${DAEMON_BIN} stop"
SOME_VARIABLE="foo"

CHEF_CONFIG_FILE_PATH="/path/to/file"
NODE_INFO_FILE="/mnt/node_info/properties"

function get_key_value (){
    value=$(grep -Po "(?<=^${1}:).*" ${NODE_INFO_FILE})
    echo $value;
}

eval $DAEMON_BIN_STOP

nohup pkill DAEMON &> /dev/null

nohup pkill -f resque &> /dev/null

eval $DAEMON_BIN_START

sleep 15

PROCESS_COUNT=`ps aux | awk '/[p]rocess-name/' | wc -l`

NODE_NAME=`get_key_value node_name`

if [[ $NODE_NAME -eq $SOME_VARIABLE  && $PROCESS_COUNT -eq 1 ]]; then 
    echo "DAEMON and scheduler are running fine." ;
else
    echo "A problem with DAEMON has occured." ;
fi

EXPECTED_PROCESS_COUNT=`get_key_value no_of_workers`
ACTUAL_WORKER_COUNT=`ps ax | grep [r]esque-[0-9]`

if [[ $EXPECTED_PROCESS_COUNT -eq $ACTUAL_WORKER_COUNT ]]; then 
    echo "Correct Number of workers initialized." ;
else
    echo "More workers exist than are permitted." ;
fi

for (( i=0; i<${EXPECTED_PROCESS_COUNT}; i++ )); do
    WORKER_NAME=`get_key_value worker_${i}`
    COUNT=`ps ax | grep ${WORKER_NAME} | grep -v grep | wc -l`
    if [[ $COUNT -eq 1 ]]; then
        #statements
        echo "${WORKER_NAME} is running."
    else
        echo "${WORKER_NAME} may not be running or might have more than 1 copies."
    fi
done

スクリプトのデバッグ出力は次のとおりです。

+ DAEMON_BIN=/etc/init.d/init-god
+ DAEMON_BIN_START='/etc/init.d/init-god start'
+ DAEMON_BIN_STOP='/etc/init.d/init-god stop'
+ SOME_VARIABLE=foo
+ CHEF_CONFIG_FILE_PATH=/path/to/file
+ NODE_INFO_FILE=/mnt/node_info/properties
+ eval /etc/init.d/init-god stop
++ /etc/init.d/init-god stop
.
Stopped all watches
Stopped god
+ nohup pkill DAEMON
+ nohup pkill -f resque
Terminated

このスクリプトが「終了」メッセージで終了するのはなぜですか?これを防ぐにはどうすればよいですか?

承認された回答:

pkill -f resqueを呼び出す場合 また、スクリプトと一致し、SIGTERMを送信します。 pkillに制限を追加できない場合 より正確なマッチングなどのコマンドでは、スクリプトがそれ自体を強制終了しないように、一度に1つずつPIDを強制終了する必要があります。次に例を示します:

pids=( $(pgrep -f resque) )
for pid in "${pids[@]}"; do
  if [[ $pid != $$ ]]; then
    kill "$pid"
  fi
done

Linux
  1. 関数とパラメータを変数として持つシェルスクリプト?

  2. Sedでテール出力を着色しますか?

  3. ユーザーとして引数を使用してスクリプトを実行しますか?

  1. 実際の例を含むエコーコマンド

  2. bashスクリプトにスペースを含むベース名?

  3. シェルスクリプトを使用して /etc/hosts ファイルに行を追加します

  1. 「でスクリプトを実行します。 」と「ソース」で?

  2. シェルスクリプトの予期しない動作?

  3. シェルスクリプトがメールコマンドでハングアップしますか?