GNU/Linux >> Linux Esercitazione >  >> Linux

Lo script termina bruscamente con un messaggio terminato?

Questo è il mio script bash. Tutto quello che fa è controllare se un servizio è stato avviato e se alcuni processi funzionano come previsto.

Termina bruscamente con un messaggio "Terminato". Ho provato a eseguire il debug con set -x flag, e ancora non so cosa sta andando storto. Stack Overflow e Google non mi mostrano altre persone con un problema simile.

Lo script ha i permessi di 755. Alcuni comandi sono offuscati, per ovvi motivi.

#!/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

L'output di debug dello script è il seguente:

+ 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

Perché questo script esce con un messaggio "Terminato"? Cosa devo fare per evitare che ciò accada?

Risposta accettata:

Quando chiami pkill -f resque sta anche abbinando il tuo script, inviandogli un SIGTERM. Se non sei in grado di aggiungere ulteriori restrizioni su pkill comandi come la corrispondenza più esatta, dovrai uccidere i PID uno alla volta per assicurarti che lo script non si uccida da solo. Ecco un esempio:

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

Linux
  1. Esecuzione dello script con ". ” E con “fonte”?

  2. Comportamento imprevisto di uno script di shell?

  3. Lo script della shell si blocca sul comando di posta?

  4. Eseguire script con argomenti come utente?

  5. basename con spazi in uno script bash?

Come scrivere uno script Bash con esempi

Comando Echo in Linux (con esempi)

Echo Command in Linux con esempi

Libreria di output di script di shell colorata

Aggiungi una riga al file /etc/hosts con lo script della shell

Chiarimento relativo al comportamento dello script della shell insieme alla pipe