GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Skript endet abrupt mit einer abgebrochenen Nachricht?

Dies ist mein Bash-Skript. Es wird lediglich überprüft, 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 zu debuggen Flagge, und ich weiß immer noch nicht, was falsch 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 sieht wie folgt aus:

+ 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?

Akzeptierte Antwort:

Wenn Sie pkill -f resque aufrufen es stimmt auch mit Ihrem Skript überein und sendet ihm ein SIGTERM. Wenn Sie keine zusätzlichen Einschränkungen für pkill hinzufügen können Befehle wie genauere Übereinstimmung müssen Sie 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

Linux
  1. Shell-Skript mit Funktion und Parameter als Variablen?

  2. Schwanzausgabe mit Sed einfärben?

  3. Skript mit Argumenten als Benutzer ausführen?

  4. Echo-Befehl mit praktischen Beispielen

  5. Ist es möglich, ein Bash-Shell-Skript mit einem anderen Befehlszeilenprogramm interagieren zu lassen?

So schreiben Sie ein Bash-Skript mit Beispielen

Echo-Befehl in Linux (mit Beispielen)

Echo-Befehl in Linux mit Beispielen

Farbige Shell-Script-Ausgabebibliothek

Skriptausgabe wird trotz separater Echo-Anweisungen in einer Meldung gepuffert?

Klarstellung bezüglich des Verhaltens von Shell-Skript zusammen mit Pipe