쉘 스크립트를 사용하여 프로세스 이름으로 여러 프로세스 종료

쉘 스크립트를 사용하여 프로세스 이름으로 여러 프로세스 종료

프로세스를 시작하고 종료하는 쉘 스크립트가 있습니다. 프로세스 이름을 매개변수로 받아들입니다. 그들을 찾아서 죽여야 합니다 pid.

처음에는 이랬어요

for procname in ${@};do
    pkill -f $procname
done

이유는 모르겠지만 전달된 모든 프로세스가 종료되지는 않습니다. 이제 나는 이런 것을 찾고 있습니다.

for procname in ${@};do
  IFS=$"\n"; echo
    (ps auxw | awk -v proc="$procname" -v preserve="${0##*/}" \
       '$0 ~ proc && $0 !~ preserve && ! /awk/ { print $2}')
done

위 코드에서 pid를 인쇄하려고 하는데 kill명령이 필요하고 for 루프 없이 작동하면 괜찮을 것입니다.

프로세스 이름에는 .다음과 같은 내용이 포함됩니다.com.abc.def.pqr.xyz

답변1

pkill -f -- "$regex"ps -f공백( 표준 또는 BSD에서 보고된 것과 동일 )과 연결된 인수 목록(명령을 실행하는 프로세스 또는 명령을 실행한 조상이 있는 프로세스의 경우)이 ps u주어진 확장 정규식과 일치하는 프로세스를 종료합니다(항상 자신을 제외함).

따라서 여기서 필요한 것은 위치 매개변수를 다음과 결합하는 것입니다 |.

IFS='|'
pkill -f -- "$*"

인수 목록 대신 프로세스 이름을 일치시키려면 를 제거하십시오 -f. 그러나 Linux에서는 프로세스 이름의 길이가 15바이트로 제한되므로 이는 불가능합니다 com.abc.def.pqr.xyz. 또한 이는 .단일 문자 연산자와 일치하는 정규식이라는 점에 유의하십시오. 해당 문자가 포함된 프로세스 매개변수 목록(예: comXabcYdefZpqr+xyz)을 일치시키려면 정규식이 필요합니다 com\.abc\.def\.pqr\.xyz.

답변2

@Stéphane Chazelas의 답변에 감사드립니다. 왜냐하면 이 쉘 스크립트에 대한 매개변수는 에서 가져오는데 공백으로 구분되어 있고 JAVA프로세스 이름에 문자가 포함되어 있기 때문입니다. .이것이 내가 알아 낸 방법입니다 ...

temp=()
for procname in ${@}; do
    temp+=$(jps -ml | grep $procname | grep -v grep | awk '{print $1 " "}')
done
kill -9 $temp

관련 정보