다음 스크립트가 있습니다. 실행 중이 아니면 프로세스를 시작해야 합니다.
$ cat keepalive_stackexchange_sample.bash
#!/bin/bash -xv
# This script checks if a process is running and starts it if it's not.
# If the process is already running, the script exits with exit code 0.
# If the process was restarted by the script, the script exits with exit code 0.
# If the process fails to start, the script exits with exit code 2.
# If the first argument is "-h" or "--help", the script prints a help message and exits with exit code 10.
#
if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
echo "Usage: $0 process_name"
echo "This script checks if a process is running and starts it if it's not."
exit 10
fi
if [[ -z "$1" ]]; then
echo "Error: No process name provided."
echo "Usage: $0 process_name"
exit 12
fi
if pgrep -x -f $@ > /dev/null; then
echo "Process '$@' is already running."
exit 0
else
echo "Process '$@' is not running. Starting it..."
if ! "$@" &> /dev/null; then
echo "Error: Failed to start process '$@'"
exit 2
fi
echo "Process '$@' started successfully"
exit 0
fi
스크립트는 얻는 프로세스 이름이 단 한 단어(예를 들어)이면 제대로 작동합니다 keepalive_stackexchange_sample.bash sox_authfiles_auditd_v2r
.
그러나 확인 중인 프로세스에 매개변수가 있는 경우 pgrep
해당 매개변수는 해당 프로세스에 특정한 것으로 간주되어 스크립트가 예상대로 작동하지 않습니다. 예를 들어 다음을 실행하면:
$ ps -ef | grep [s]ox_ | grep v2r
username 12150 1 0 23:07 ? 00:00:00 sox_user_auditd_v2r -c
$
실행했는데 keepalive_stackexchange_sample.bash sox_user_auditd_v2r -c
다음 오류가 발생합니다.
+ pgrep -x -f sox_user_auditd_v2r -c
pgrep: invalid option -- 'c'
Usage: pgrep [-flvx] [-d DELIM] [-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]
[-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] [PATTERN]
+ echo 'Process '\''sox_user_auditd_v2r' '-c'\'' is not running. Starting it...'
sox_user_auditd_v2r -c
스크립트가 이미 실행 중이 더라도 실행됩니다.
매개변수가 있는 프로세스에서 스크립트가 작동하도록 하는 방법에 대한 제안이 있으십니까?
답변1
pgrep이 이를 단일 문자열로 처리하도록 프로세스 이름과 옵션을 인용해야 합니다.
스크립트를 실행할 때 이 작업을 수행할 수 있습니다.
keepalive_stackexchange_sample.bash 'sox_user_auditd_v2r -c'
또는 스크립트 자체에서:
if pgrep -x -f "$*" > /dev/null; then ...
이것은 스크립트의 모든 인수가 별도의 단어가 아닌 하나의 문자열이기를 원하기 때문에 "$*"
대신 사용하려는 몇 안 되는 경우 중 하나입니다 . pgrep에는 바로 이것이 필요합니다."$@"
pgrep
하나패턴 인수.
나중에 스크립트에서 프로세스를 다시 시작할 때 "$@"
명령과 해당 옵션이 모두 인수로 필요하므로 셸에서 별도의 단어로 처리되는 인수를 사용해야 합니다.