프로세스를 확인하고 실행 중인 프로세스를 종료합니다.

프로세스를 확인하고 실행 중인 프로세스를 종료합니다.

프로세스가 실행 중인지 알고 싶습니다. 실행 중이면 스크립트를 호출하거나 무언가를 인쇄하고 싶습니다. 다음을 시도했지만 구문 오류 또는 명령을 찾을 수 없음 오류가 발생합니다.

APP_ID = ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java | awk '{print$2}'

if[''!= '${APP_ID}'] then
    echo "Stopping instance $APP_ID"

내가 얻는 결과는 다음과 같습니다.

test.sh: line 15: APP_ID: command not found
test.sh: line 17: if[!= ${APP_ID}]: command not found
Stopping instance 

위 스크립트에 어떤 문제가 있나요? 오류가 있는 경우 echo조건부로 인쇄하는 이유는 무엇입니까 if?

아래 스크립트도 실패합니다.test.sh: line 3: [ps: command not found

if [ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java]; then
    echo 'stop'
fi

답변1

구문에 많은 문제가 있습니다.

  • 변수 설정 시 "=" 주위의 공백을 제거하세요.

    잘못된:

    APP_ID = value
    

    옳은:

    APP_ID=value
    
  • 프로그램을 실행하고 그 출력을 변수에 넣으려면 $(...)(bash에서 선호, sh에서는 사용할 수 없음) 또는 백틱 `command`(bash 및 sh에서 지원)이 필요합니다. (변수를 할당할 때는 따옴표가 필요하지 않지만 다른 경우에는 중요하다는 점을 기억하세요 command "$(command)". :)

    잘못된:

    APP_ID=command
    

    옳은:

    APP_ID=$(command)
    
  • "["를 사용할 때 모든 항목 주위에 공백을 추가하고 "]" 뒤에는 세미콜론이나 개행 문자가 필요합니다. 이는 "["가 bash 내장 명령이고, 내장되지 않은 명령을 "test"라고도 하며(참고자료 참조 man test), 다른 명령과 마찬가지로 인수가 공백으로 구분되기 때문입니다.

    잘못된:

    if[x!= y] then echo hello world fi
    

    옳은:

    if [ x != y ]; then echo hello world; fi
    
  • 변수를 확장하려면 작은따옴표 대신 큰따옴표를 사용하세요.

    잘못된:

    if [ '' != '${APP_ID}' ]; then
    

    옳은:

    if [ '' != "${APP_ID}" ]; then
    
  • 또한 위의 예에서는 빈 문자열과 비교하는 대신 -n(비어 있지 않음)을 사용할 수 있습니다.

    if [ -n "${APP_ID}" ]; then
    
  • ps 예제의 경우 grep 및 awk가 필요하지 않습니다.

    APP_ID=$(ps -C whoami --no-header --format 'pid')
    

고정된 스크립트는 다음과 같습니다.

APP_ID=$(ps -C whoami --no-header --format 'pid')

if [ -n "${APP_ID}" ]; then
    echo "Stopping instance $APP_ID"
fi

답변2

pgrep이는 다음을 사용하여 가장 쉽게 수행할 수 있습니다 pkill.

if pgrep process_name 2>/dev/null; then
  echo "Terminating process_name"
  pkill process_name
fi

@OrangeDog 사용자가 의견에서 지적했듯이 이 셸 코드는 이론적으로 프로세스를 종료하지 못할 수도 있습니다.process_name pgrep호출과 호출 사이에 프로세스가 생성되는 경우pkill. 이 경우 pgrep프로세스는 감지되지 않으며 pkill실행되지 않습니다. 이것이 얼마나 큰 문제인지 모르겠습니다. 프로세스가 단순히 생성되는 경우뒤쪽에성명서, 당신은 무엇을 할 수 있습니까?

그냥 해

echo "terminating process_name (if it is running)"
pkill process_name

어쨌든 불쾌한 경쟁 조건을 제거하십시오.

답변3

이유는 모르겠지만 위 스크립트는 구문 문제를 제공하지 않으며 프로세스가 실행 중이지만 프로세스 ID도 제공하지 않습니다.

결국 다음과 같이 변경했고 작동했습니다.

APP_ID=$(ps -ef | grep <app_name> | grep java | awk '{print $2}')

echo "Instance $APP_ID"
if [ -n "${APP_ID}" ]; then
    echo "Stopping instance $APP_ID"
fi

귀하의 설명과 지도에 다시 한 번 감사드립니다.

@Peter, 게시한 스크립트를 다시 확인하여 왜 작동하지 않는지 확인하겠습니다.

답변4

위 명령은 grep 자체도 캡처하므로 Java 프로세스인 경우 명령은 다음과 같습니다.

APP_ID=$(ps -ef | grep <app_name> | grep -v grep | awk '{print $2}')

echo "Instance $APP_ID"
if [ -n "${APP_ID}" ]; then
    echo "Stopping instance $APP_ID"
    kill $APP_ID   (or kill -9 $APP_ID)
fi

도움이 되었기를 바랍니다.

관련 정보