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