"pgrep"이 인수를 포함하는 것으로 확인하는 표현식을 처리하는 것을 방지하는 방법은 무엇입니까?

"pgrep"이 인수를 포함하는 것으로 확인하는 표현식을 처리하는 것을 방지하는 방법은 무엇입니까?

다음 스크립트가 있습니다. 실행 중이 아니면 프로세스를 시작해야 합니다.

$ 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하나패턴 인수.

나중에 스크립트에서 프로세스를 다시 시작할 때 "$@"명령과 해당 옵션이 모두 인수로 필요하므로 셸에서 별도의 단어로 처리되는 인수를 사용해야 합니다.

관련 정보