GNU/Linux >> Tutoriales Linux >  >> Linux

¿La secuencia de comandos finaliza abruptamente con un mensaje terminado?

Este es mi script bash. Todo lo que hace es comprobar si un servicio se ha iniciado y si algunos procesos se están ejecutando como se esperaba.

Termina abruptamente con un mensaje "Terminado". Intenté depurarlo con set -x bandera, y todavía no sé qué está yendo mal. Stack Overflow y Google no me muestran otras personas con un problema similar.

El script tiene permisos de 755. Algunos comandos están ofuscados, por razones obvias.

#!/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 salida de depuración del script es la siguiente:

+ 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

¿Por qué esta secuencia de comandos sale con un mensaje "Terminado"? ¿Qué debo hacer para evitar que esto suceda?

Respuesta aceptada:

Cuando llamas a pkill -f resque también está haciendo coincidir su script, enviándole un SIGTERM. Si no puede agregar restricciones adicionales en pkill comandos como una coincidencia más exacta, deberá eliminar los PID de uno en uno para asegurarse de que la secuencia de comandos no se esté eliminando a sí misma. Aquí hay un ejemplo:

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

Linux
  1. ¿Comportamiento inesperado de un script de Shell?

  2. ¿Script de shell con función y parámetro como variables?

  3. ¿La secuencia de comandos de Shell se bloquea en el comando de correo?

  4. Comando Echo con Ejemplos Prácticos

  5. nombre base con espacios en un script bash?

Cómo escribir un script Bash con ejemplos

Comando Echo en Linux (con ejemplos)

Comando Echo en Linux con ejemplos

Leer línea por línea en bash script

Biblioteca de salida de scripts de shell de colores

Agregue una línea al archivo /etc/hosts con script de shell