
Dies ist mein Bash-Skript. Es prüft lediglich, ob ein Dienst gestartet wurde und ob einige Prozesse wie erwartet ausgeführt werden.
Es endet abrupt mit der Meldung „Beendet“. Ich habe versucht, es mit dem set -x
Flag zu debuggen, und weiß immer noch nicht, was schief läuft. Stack Overflow und Google zeigen mir keine anderen Personen mit einem ähnlichen Problem.
Das Skript hat die Berechtigungen 755. Einige Befehle sind aus offensichtlichen Gründen verschleiert.
#!/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
Die Debug-Ausgabe des Skripts lautet wie folgt:
+ 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
Warum wird dieses Skript mit der Meldung „Beendet“ beendet? Was kann ich tun, um dies zu verhindern?
Antwort1
Wenn Sie es aufrufen, pkill -f resque
gleicht es auch Ihr Skript ab und sendet ihm ein SIGTERM. Wenn Sie den pkill
Befehlen keine zusätzlichen Einschränkungen hinzufügen können, wie z. B. eine genauere Übereinstimmung, müssen Sie die PIDs einzeln beenden, um sicherzustellen, dass sich das Skript nicht selbst beendet. Hier ist ein Beispiel:
pids=( $(pgrep -f resque) )
for pid in "${pids[@]}"; do
if [[ $pid != $$ ]]; then
kill "$pid"
fi
done