이것은 내 bash 스크립트입니다. 그것이 하는 일은 서비스가 시작되었는지, 일부 프로세스가 예상대로 실행되고 있는지 확인하는 것뿐입니다.
"종료" 메시지와 함께 갑자기 종료됩니다. 해당 플래그로 디버깅을 시도했지만 set -x
여전히 무엇이 문제인지 모르겠습니다. Stack Overflow와 Google은 비슷한 문제가 있는 다른 사람을 보여주지 않았습니다.
이 스크립트의 권한은 755입니다. 일부 명령은 명백한 이유로 혼동됩니다.
#!/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
스크립트의 디버그 출력은 다음과 같습니다.
+ 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
이 스크립트가 "종료됨" 메시지와 함께 종료되는 이유는 무엇입니까? 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
답변1
호출하면 pkill -f resque
스크립트와 일치하여 SIGTERM을 보냅니다. 명령에 다른 제한 사항(예: 보다 정확한 일치)을 추가 할 수 없는 경우 pkill
스크립트가 자동으로 종료되지 않도록 한 번에 하나의 PID를 종료해야 합니다. 예는 다음과 같습니다.
pids=( $(pgrep -f resque) )
for pid in "${pids[@]}"; do
if [[ $pid != $$ ]]; then
kill "$pid"
fi
done