주어진 실행 파일 이름을 가진 프로세스를 검색하려고 합니다.그리고연관된 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 ao
BSD 스타일 구문이며 ps -C
HP/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
, bunzip2
및 bzcat
는 모두 동일한 파일이므로 실행 파일 일치는 프로세스 이름 일치보다 실제로 덜 유용합니다. 명령이 bzip2
또는 를 호출하는 bunzip2
프로세스를 구별하지 않기 때문입니다 bzcat
.
일명 압축/압축 해제/bzcat 여부를 결정하기 위해 기본 이름을 살펴봅니다. 엄밀히 말하면 bzcat
이것이 우리가 일치시키고 싶은 것(Linux에서 발견)이어야 하지만 아마도 99% 이상의 시간 동안 노력할 가치가 없을 것입니다. name은 전달된 실행 파일의 기본 이름과 동일합니다(잘리지는 않지만).bzip2
bunzip2
argv[0]
/proc/pid/cmdline
argv[0]
execve()