
pgrep -f
pgrep의 프로세스 이름 길이는 15자로 제한되어 있으므로 명령을 실행할 때 항상 더 긴 이름의 프로세스 ID 목록을 사용했습니다 . 그러나 여기에는 잘못된 결과를 제공하는 전체 명령줄 인수가 포함되어 있습니다.
예: my_long_script_name.sh
그것이 실행 중이고 나는 vi my_long_script_name.sh
(지금은 실행 중인 프로그램 편집을 무시함) 가정해 보겠습니다.
실행하면 프로세스 ID와 pgrep -f my_long_script_name.sh
프로세스 ID가 반환됩니다.my_long_script_name.sh
vi my_long_script_name.sh
pgrep -d ' '
매개변수 목록이 아닌 프로세스 이름만을 기준으로 프로세스 ID 목록을 얻으려면 어떻게 해야 합니까? 목록에서 해당 프로세스를 종료하거나 동일한 방식으로 생성할 수 있습니까?
Buster를 실행 중이지만 Wheezy와 같은 이전 OS에서도 동일한 문제가 발생합니다. 요청한 대로 를 실행하면 sed -n l "/proc/$pid/comm"
내 터미널 세션은 $pid
어디에 $BASHPID
있습니까 bash$
? 내가 달리면 sed -n l "/proc/$pid/cmdline"
나는 그것을 얻을 것이다 -bash\000$
. 그 뒤에는 1 대신 소문자 L이 옵니다 -n
. 실행하면 cat -vte
멈춥니다.
답변1
문제는 그런게 없다는거긴 프로세스 이름.
일부는프로세스 이름( /proc/pid/comm
Linux) Linux에서 최대 15바이트 길이이며 상위 프로세스에서 상속되며 execve()
프로세스가 실행 중인 파일 기본 이름의 처음 15바이트에 대해 시스템 호출을 할 때마다 변경됩니다. 값을 입력 prctl()
하거나 파일에 기록 comm
).
이것이 없이 또는 함께 보고된 내용입니다 ps
. 그리고 기본적으로 일치하는 것은 무엇입니까?-f
-o comm
pgrep
도 있습니다매개변수 목록/proc/pid/cmdline
( Linux의 경우) 프로세스는 마지막으로 실행된 명령을 전달했습니다 . 관례적으로 첫 번째 인수는 실행 중인 파일의 기본 이름 또는 경로입니다.
ps -f
또는 ps -o args
이러한 인수를 공백 문자와 연결하여 인쇄하고 pgrep -f
결과 문자열과 일치시킵니다. 이러한 연결로 인해 각 매개변수가 시작되고 끝나는 위치에 대한 정보가 손실됩니다.
그러나 첫 번째 인수에 공백 문자가 포함되어 있지 않다고 가정할 수 있는 경우 첫 번째 인수에 다음이 포함된 my_long_script_name.sh
프로세스를 계속 일치시킬 수 있습니다.
pgrep -f '^[^ ]*my_long_script_name\.sh'
pgrep
(바꾸기 ) 해당 프로세스를 종료하려면 .pkill
안정성을 높이기 위해 Linux에서는 zsh
다음을 수행할 수 있습니다.
print -C1 /proc/<->(Ne[$'[[ ${"$(<$REPLY/cmdline)"%%\0*} = (*/|)my_long_script_name.sh ]]']:t)
즉, /proc/pid/cmdline
인수가 구분된 위치 에서 직접 정보를 가져오고 $'\0'
첫 번째 인수로 이어지는 부분이 또는 $'\0'
로 my_long_script_name.sh
끝나는 지 확인합니다 /my_long_script_name.sh
.
xargs kill
해당 프로세스를 종료하려면 다음으로 파이프하십시오.