
다른 경로에서 동일한 파일 이름을 가진 3개의 앱을 실행하고 있습니다.
$ ~/app1/main
$ ~/app2/main
$ ~/app3/main
실행 파일의 전체 이름을 받아들이고 해당 앱을 종료하는 bash 스크립트를 만들고 싶습니다.
$ ./my_killer.sh /home/me/app2/main
어떻게 해야 하나요? 특히 전체 이름으로 앱을 종료하려면 어떻게 해야 하나요?
답변1
Linux만 지원해야 하는 경우(귀하의 질문에 linux 태그가 지정되어 있는 경우인 것 같습니다) 심볼릭 링크를 사용할 수 있습니다 /proc/%d/exe
.
다음은 이를 수행할 수 있는 스크립트의 예입니다.
#!/bin/bash
if [ "$#" != 1 ] || [ "$1" = "" ]
then
echo "Usage: $0 <full-exe-path>" 1>&2
exit 1
fi
shopt -s extglob
cd /proc
for PID in [1-9]*([0-9])
do
if [ "$(readlink "$PID"/exe)" = "$1" ]
then
kill "$PID"
fi
done
한 가지 주의할 점은 프로세스 ID가 커널 스레드이거나 자신이 소유하지 않은 경우 readlink
실패하고 "$(readlink "$PID"/exe)"
빈 문자열로 평가된다는 것입니다. 모든 프로세스를 종료하려는 시도를 피하기 위해 스크립트는 $1
빈 문자열 인 경우 어떤 작업도 거부합니다 .
또한 이 스크립트는 간격 내의 문자 뒤에 간격 내의 문자 수 를 의미하는 extglob
일치 디렉터리를 허용하는 기능을 사용한다는 점에 유의하세요 .[1-9]*([0-9])
1-9
0-9
답변2
나는 배관이 있는 단일 라이너로 이 작업을 수행합니다( gawk
및 필요 xargs
).
$>ps -ax | grep "/app2/main" | grep -v "grep" | gawk '{print $1}' | xargs kill
여기서 무슨 일이 일어나고 있나요?
ps -ax # — list all processes in extended format
grep "/app2/main" # — show only processes that contain "/app2/main"
grep -v "grep" # — sort out the previous grep process with the mentioned string
gawk '{print $1}' # — use gawk to pick only the first column (process id)
xargs kill # — use xargs to pass pid to kill as an argument
이는 필요한 프로세스에 효과적으로 종료 신호를 보냅니다. 인수가 포함된 짧은 명령을 원하는 경우 bash 스크립트로 래핑할 수 있습니다.