서로 다른 위치에 동일한 파일 이름을 가진 3개의 다른 앱, 전체 이름으로 앱을 죽이는 방법은 무엇입니까?

서로 다른 위치에 동일한 파일 이름을 가진 3개의 다른 앱, 전체 이름으로 앱을 죽이는 방법은 무엇입니까?

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

관련 정보