명령줄 인수 대신 긴 명령 이름에 대한 프로세스 ID 목록을 얻으려면 어떻게 해야 합니까?

명령줄 인수 대신 긴 명령 이름에 대한 프로세스 ID 목록을 얻으려면 어떻게 해야 합니까?

pgrep -fpgrep의 프로세스 이름 길이는 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.shvi 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/commLinux) Linux에서 최대 15바이트 길이이며 상위 프로세스에서 상속되며 execve()프로세스가 실행 중인 파일 기본 이름의 처음 15바이트에 대해 시스템 호출을 할 때마다 변경됩니다. 값을 입력 prctl()하거나 파일에 기록 comm).

이것이 없이 또는 함께 보고된 내용입니다 ps. 그리고 기본적으로 일치하는 것은 무엇입니까?-f-o commpgrep

도 있습니다매개변수 목록/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해당 프로세스를 종료하려면 다음으로 파이프하십시오.

관련 정보