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-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 스크립트로 래핑할 수 있습니다.

관련 정보