GNU/Linux >> Belajar Linux >  >> Linux

Script Berakhir Tiba-tiba Dengan Pesan yang Dihentikan?

Ini adalah skrip bash saya. Yang dilakukan hanyalah memeriksa apakah suatu layanan telah dimulai dan apakah beberapa proses berjalan seperti yang diharapkan.

Itu berakhir tiba-tiba dengan pesan "Dihentikan". Saya mencoba men-debug dengan set -x bendera, dan saya masih tidak tahu apa yang salah. Stack Overflow dan Google tidak menunjukkan kepada saya orang lain yang memiliki masalah serupa.

Script memiliki izin 755. Beberapa perintah dikaburkan, untuk alasan yang jelas.

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

Output debug skrip adalah sebagai berikut:

+ 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

Mengapa skrip ini keluar dengan pesan "Dihentikan"? Apa yang harus saya lakukan untuk mencegah hal ini terjadi?

Jawaban yang Diterima:

Saat Anda memanggil pkill -f resque itu juga cocok dengan skrip Anda, mengirimkannya SIGTERM. Jika Anda tidak dapat menambahkan batasan tambahan pada pkill perintah seperti pencocokan yang lebih tepat, Anda harus mematikan PID satu per satu untuk memastikan skrip tidak mati sendiri. Ini contohnya:

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

Linux
  1. Script Shell Dengan Fungsi Dan Parameter Sebagai Variabel?

  2. Mewarnai Keluaran Ekor Dengan Sed?

  3. Script Shell Hang Pada Perintah Mail?

  1. Jalankan Script Dengan Argumen Sebagai Pengguna?

  2. Perintah Gema dengan Contoh Praktis

  3. Apakah mungkin membuat skrip bash shell berinteraksi dengan program baris perintah lain?

  1. Edit skrip shell saat sedang berjalan

  2. Baca baris demi baris dalam skrip bash

  3. Tambahkan baris ke file /etc/hosts dengan skrip Shell