다른 경로에서 동일한 파일 이름을 가진 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 스크립트로 래핑할 수 있습니다.