TTY가 없는 프로세스를 제외하고 실행 파일 이름으로 프로세스를 검색하시겠습니까?

TTY가 없는 프로세스를 제외하고 실행 파일 이름으로 프로세스를 검색하시겠습니까?

주어진 실행 파일 이름을 가진 프로세스를 검색하려고 합니다.그리고연관된 TTY가 있습니다.

내 사용 사례는 실행 중인 클라이언트 프로세스를 식별하는 것입니다 abduco. abduco연관된 TTY가 있는 클라이언트 프로세스와 연관된 TTY가 없는 서버 프로세스를 실행하므로 이를 사용하여 둘을 구별할 수 있습니다 .

지금까지 저는 두 가지 방법을 생각해냈습니다. 나는 뛸 수 있습니다:

ps ao pid,comm | grep abduco

기본적으로(추가된 옵션 없음 x) 관련 TTY가 있는 프로세스만 고려됩니다.

또는 섹션을 ps -C통해 파이프할 필요 없이 실행 파일 이름을 활용하여 프로세스를 선택할 수 있습니다. grep그러나 여기에는 연관된 TTY가 없는 프로세스가 포함되며 ps이 설정을 변경할 수 있는 옵션은 없는 것 같습니다. 그래서 TTY를 보고하는 프로세스를 필터링하기 위해 몇 가지 후처리를 수행해야 했습니다 ?.

ps -C abduco o pid,tty

더 깨끗한 솔루션이 있습니까?

답변1

각 시스템에는 ps고유한 구문과 기능을 가진 고유한 명령이 있습니다.

POSIX는 명령을 지정 ps하지만 많은 옵션은 선택 사항입니다.

사용하는 옵션은 표준이 아닙니다. ps aoBSD 스타일 구문이며 ps -CHP/UX 옵션입니다. 다양한 구현의 기능을 ps결합하려고 시도하므로 procps 구현을 사용해야 합니다 .ps

그럼에도 불구하고 주어진 이름으로 프로세스를 보고하고 tty를 제어하도록 지시하는 방법을 모르겠습니다.

따라서 후처리가 필요합니다.

ps -o pid= -o tty= -C abduco | awk '$2 != "?" {print $1}'

어쨌든 -C "$string"실제 실행 파일 이름이 아닌 프로세스 이름과 일치하도록 주의하세요. Linux에서 프로세스 이름은 프로세스의 속성인 최대 15바이트의 문자열입니다. 상위 프로세스에서 상속되며 execve()프로세스가 시스템 호출을 수행할 때마다 변경됩니다. 이 경우 프로세스 이름은 전달된 파일 경로의 기본 이름 중 처음 15바이트로 변경됩니다 execve()(그러므로 이런 의미에서 말하자면, 는실행 파일 이름) 또는 prctl(PR_SET_NAME)전화로(드물지만).

/proc/<pid>/exe프로세스가 실행 중인 코드의 실행 파일을 일치시키려면 기호 링크(Linux의 경우)를 확인해야 합니다 .

예를 들어 다음과 같습니다 zsh.

print -rC1 -- /proc/*/exe(e['[[ $REPLY -ef =bzip2 ]]']:h:t)

명령을 실행하는 프로세스의 pid를 보고합니다 ( bzip2심볼릭 링크가 해결된 후 파일이 /proc/pid/exe처음 나타나는 것과 동일 함).bzip2$PATH

tty가 있는 사용자에게만 제한됩니다.

() {
  print -rC1 -- /proc/$^@/exe(e['[[ $REPLY -ef =bzip2 ]]']:h:t)
} $(ps ao pid=)

그러나 bzip2, bunzip2bzcat는 모두 동일한 파일이므로 실행 파일 일치는 프로세스 이름 일치보다 실제로 덜 유용합니다. 명령이 bzip2또는 를 호출하는 bunzip2프로세스를 구별하지 않기 때문입니다 bzcat.

일명 압축/압축 해제/bzcat 여부를 결정하기 위해 기본 이름을 살펴봅니다. 엄밀히 말하면 bzcat이것이 우리가 일치시키고 싶은 것(Linux에서 발견)이어야 하지만 아마도 99% 이상의 시간 동안 노력할 가치가 없을 것입니다. name은 전달된 실행 파일의 기본 이름과 동일합니다(잘리지는 않지만).bzip2bunzip2argv[0]/proc/pid/cmdlineargv[0]execve()

관련 정보