GNU/Linux >> Znalost Linux >  >> Linux

Skript náhle skončí s ukončenou zprávou?

Toto je můj bash skript. Jediné, co dělá, je zkontrolovat, zda se služba spustila a zda některé procesy běží podle očekávání.

Náhle končí zprávou „Ukončeno“. Zkusil jsem to odladit pomocí set -x vlajky a stále nevím, co se děje. Stack Overflow a Google mi nezobrazují žádné další osoby s podobným problémem.

Skript má oprávnění 755. Některé příkazy jsou ze zřejmých důvodů nejasné.

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

Výstup ladění skriptu je následující:

+ 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

Proč se tento skript ukončí se zprávou „Ukončeno“? Co mám udělat, aby se to nestalo?

Přijatá odpověď:

Když voláte pkill -f resque také odpovídá vašemu skriptu a posílá mu SIGTERM. Pokud nemůžete přidat další omezení na pkill příkazy, jako je přesnější párování, budete muset zabíjet PID jeden po druhém, abyste zajistili, že se skript nezabije sám. Zde je příklad:

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

Linux
  1. Spuštění skriptu s „. “ A se „zdrojem“?

  2. Spustit skript s argumenty jako uživatel?

  3. Echo Command s praktickými příklady

  1. Je možné, aby skript bash shell interagoval s jiným programem příkazového řádku?

  2. Upravte skript shellu, když je spuštěn

  3. Čtěte řádek po řádku v bash skriptu

  1. Neočekávané chování skriptu Shell?

  2. základní jméno s mezerami ve skriptu bash?

  3. Připojte řádek do souboru /etc/hosts pomocí skriptu shellu