GNU/Linux >> Tutoriels Linux >  >> Linux

Le script se termine brusquement avec un message terminé ?

Ceci est mon script bash. Tout ce qu'il fait est de vérifier si un service a démarré et si certains processus s'exécutent comme prévu.

Il se termine brusquement par un message "Terminé". J'ai essayé de le déboguer avec le set -x drapeau, et je ne sais toujours pas ce qui ne va pas. Stack Overflow et Google ne me montrent aucune autre personne ayant un problème similaire.

Le script a des autorisations de 755. Certaines commandes sont obscurcies, pour des raisons évidentes.

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

La sortie de débogage du script est la suivante :

+ 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

Pourquoi ce script se termine-t-il avec un message "Terminé" ? Que dois-je faire pour éviter que cela se produise ?

Réponse acceptée :

Lorsque vous appelez pkill -f resque il correspond également à votre script, en lui envoyant un SIGTERM. Si vous ne parvenez pas à ajouter des restrictions supplémentaires sur le pkill commandes telles qu'une correspondance plus exacte, vous devrez tuer les PID un par un pour vous assurer que le script ne se tue pas lui-même. Voici un exemple :

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

Linux
  1. Exécution du script avec ". » Et avec « source » ?

  2. Comportement inattendu d'un script shell ?

  3. Coloriser la sortie de queue avec Sed ?

  4. Commande d'écho avec des exemples pratiques

  5. nom de base avec des espaces dans un script bash ?

Comment écrire un script bash avec des exemples

Commande Echo sous Linux (avec exemples)

Commande Echo sous Linux avec exemples

Bibliothèque de sortie de script shell coloré

Ajouter une ligne au fichier /etc/hosts avec le script shell

Automatisez mysql_secure_installation avec la commande echo via un script shell