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