프로세스 이름이 지정된 프로세스를 자동으로 종료하는 Bash 스크립트

프로세스 이름이 지정된 프로세스를 자동으로 종료하는 Bash 스크립트

제목에서 짐작하실 수 있듯이 저는 특정 프로그램 이름의 모든 프로세스를 종료하는 bash 스크립트를 작성하려고 하지만 이 분야에 대한 경험은 거의 없습니다. 내가 찾은 것은 다음과 같습니다.

ps -aux | grep $processToClose

해당 이름을 가진 모든 프로세스를 가져올 수 있지만 해당 프로세스를 종료하려면 수동으로 다음을 사용합니다.

kill -9 $processPID

프로세스 종료 부분을 자동화하는 방법에 대한 아이디어가 있습니까?

(내가 왜 이런 짓을 하고 싶은지 궁금하시다면: 저는 업무용 노트북과 일상 컴퓨터로 anydesk를 사용하기 때문에 하나만 사용해야 하는데 가끔 (기본적으로 매일) anydesk가 작동하지 않기로 선택해서 위에서 작성한 명령을 사용하여 닫습니다)

답변1

그것이 pkill목적입니다.

pkill regexp

이름( 또는 에 의해 보고됨 )이 정규식과 일치하는 프로세스를 종료합니다( SIGTERM 과 유사하며 kill일반적으로 SIGKILL (9)를 사용하지 않습니다) .psps -o comm

pkill -f regexp

arglist(그들 또는 그들의 조상 중 하나가 명령을 실행했다고 가정) ps -f(또는 ps -o commBSD 플레이버 ps aux)가 확장 정규 표현식과 일치한다고 보고하는 사람들을 위한 것입니다.

-x전체 이름/인수 목록과 일치하는 정규식 옵션이 추가되었습니다 . 예를 들어, 실행 중인 프로세스 나 종료되었을 프로세스 대신 pkill -x xterm실행 중인 프로세스를 종료합니다 .xtermlxtermxterminatorpkill xterm

따라서 정규식 연산자( ) 가 없다고 $processToClose가정하고 이름이 저장된 프로세스를 종료하려면 다음을 수행합니다 .$processToClose\|$^*()+[]{}.?

pkill -x -- "$processToClose"

정규식 연산자를 포함하거나 포함할 수 있는 경우 다음을 사용하여 이스케이프해야 합니다 \.

LC_ALL=C pkill -x -- "$(
  printf '%s\n' "$processToClose" |
    LC_ALL=C sed 's/[][\\|$^*()+{}.?]/\\&/g')"

이는 또한 둘 다의 로케일을 C로 설정 pkill하고 sed프로세스 이름이 반드시 사용자 로케일에서 유효한 텍스트를 형성하지 않도록 허용합니다.

pkill어떤 프로세스가 종료되는지 확인하려면 pkill로 바꿀 수 있습니다 pgrep -l.

pgrep/는 pkill표준 명령은 아니지만 매우 일반적입니다.

ps표준이지만 휴대하기가 매우 어렵습니다. 옵션 목록과 출력 형식은 구현마다 크게 다릅니다. 특히, ps -auxLinux 기반 시스템에서 일반적으로 발견되는 procps구현 만 사용하게 될 것입니다. ps이것은 BSD 스타일이지만 ps aux앞면이 가짜입니다.-

POSIX는 매우 제한된 옵션 목록을 지정합니다.

ps -A -o pid= -o comm= |
  NAME=$processToClose awk '
    NF == 2 && $2 "" == ENVIRON["NAME"] {print $1}' |
  xargs kill

프로세스 이름 에 공백이 포함되어 있지 않다고 가정하는 것이 $processToClose표준 접근 방식입니다 .

답변2

ps -aux |grep $processName |awk '{print $2}'| xargs -I {} kill{}

관련 정보