주어진 pts/tty를 실행하는 쉘의 PID를 어떻게 결정합니까?

주어진 pts/tty를 실행하는 쉘의 PID를 어떻게 결정합니까?

tty명령을 사용하거나 구문 분석 (열려 있고 리디렉션되지 않는다고 가정) 등 특정 프로세스와 연관된 PTS를 가져오는 방법에는 여러 가지가 있지만 /proc/self/fd/0그 반대의 경우는 어떻습니까? pts를 실행하는 쉘의 PID를 얻는 방법은 무엇입니까?

비슷한 것을 사용해 볼 수 있지만 ps -t $(tty)루트 셸(예: 여러 셸 인스턴스, 장기 실행 시스템의 PID 재사용 등)을 안정적으로 결정하는 데 충분한 정보를 제공하지 않습니다. 내가 생각할 수 있는 유일한 방법은 터미널과 관련된 모든 프로세스를 수동으로 수집하고 각 프로세스의 /proc항목에 액세스하여 프로세스 계층 구조를 결정한 다음 이것이 최상위 상위 프로세스라고 가정하는 것입니다.

tty간단한 역방향 명령을 사용할 수 있나요? 많은 노력 없이 PID를 알려주실 수 있나요?

답변1

명령이 시작 시간별 정렬을 지원 하는 경우 pstty를 소유하는 가장 빠른 프로세스를 찾을 수 있습니다.

$ ps --sort start_time -t pts/138 |head -2
  PID TTY          TIME CMD
13326 pts/138  00:00:02 bash

이를 지원하지 않는 경우 ps에도 모든 관련 PID를 시작 시간(필드 22 /proc/<pid>/stat-"시스템 시작 후 프로세스가 시작된 시간") 가장 낮은 PID를 얻습니다.

$ for p in $(ps -o pid -t pts/138 |tail -n +2); do awk -v PID=$p '{print $22,PID}' /proc/$p/stat 2>/dev/null; done | sort -g | head -1 | awk '{print $2}'
13326

또는 더 읽기 쉬운 방법으로:

$ for p in $(ps -o pid -t pts/138 |tail -n +2)
do
  awk -v PID=$p '{print $22,PID}' /proc/$p/stat 2>/dev/null
done | sort -g | head -1 | awk '{print $2}'
13326 

관련 정보