프로세스가 실행 중인지 알고 싶습니다. 실행 중이면 스크립트를 호출하거나 무언가를 인쇄하고 싶습니다. 다음을 시도했지만 구문 오류 또는 명령을 찾을 수 없음 오류가 발생합니다.
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
도움이 되었기를 바랍니다.