터미널 자체에서 실행되는 프로세스에서 터미널 에뮬레이터의 PID를 아는 방법

터미널 자체에서 실행되는 프로세스에서 터미널 에뮬레이터의 PID를 아는 방법

여러 터미널이 동시에 실행되고 새 터미널을 시작하고 프로그램(예: gnome-terminal -e pathto/myprogram) 을 실행하는 상황에서는 myprogram지금 파악해야 합니다. 구체적 gnome-terminal으로 실행 중인 PID입니다. 이것이 어떻게 달성될 수 있습니까?

답변1

터미널이나 터미널 에뮬레이터에서 실행되는 애플리케이션에 대한 입력/출력은 장치 파일 /dev/ttysomething에서 나옵니다./dev/ptsomething

다른 쪽 끝(하나 이상의 의사 터미널 또는 직렬 회선 또는 ssh/telnet/rsh 연결이 포함될 수 있음)에서는 일부 물리적, 가상 또는 시뮬레이션 터미널(아마도 브라우저 창에서 실행되는 javascript로 작성됨)이 실행됩니다. 일부 로컬 또는 원격 컴퓨터 이 출력을 읽어 화면에 문자를 표시하고 입력한 내용을 문자로 보내 입력을 구성합니다.

이런 식으로 보면 "pid"를 얻는 것이 항상 가능하거나 관련성/유용한 것은 아닙니다. PID를 얻을 수도 있지만 다른 컴퓨터에서 실행 중인 웹 브라우저의 PID일 수도 있습니다.

이 작업을 수행할 수 있고 귀하가 좋아하는 경우는 제한되어 있습니다 gnome-terminal -e cmd.

gnome-terminal하지만 클라이언트/서버 아키텍처가 있기 때문에 특별한 경우입니다. gnome-terminal -e cmd, 새 터미널 에뮬레이터를 실행하는 대신 xterm -e cmd가상 tty 쌍을 생성하고 cmd슬레이브 측에서 I/O 하위 프로세스를 실행하여 gnome-terminal실행하기 위해 서버에 새 gnome 터미널 창을 열도록 요청합니다 cmd.

또한 최신 버전에서는 다음 경고에 유의하세요.

# Option “-e” is deprecated and might be removed in a later version of gnome-terminal.
# Use “-- ” to terminate the options and put the command line to execute after it.

두 번 실행 gnome-terminal -e zsh하고 view shell의 조상을 실행 하면 pstree -slpa $$다음이 표시됩니다.

$ pstree -slpa $$
systemd,1 splash
  └─systemd,7571 --user
      └─gnome-terminal-,27110
          └─zsh,27811
              └─pstree,27988 -slpa 27811
$ pstree -slpa $$
systemd,1 splash
  └─systemd,7571 --user
      └─gnome-terminal-,27110
          └─zsh,28134
              └─pstree,28145 -slpa 28134

zsh이는 다중 스레드임에도 불구하고 두 s 를 모두 시작하는 동일한 프로세스입니다 .

$ ps -Lp 27110
    PID     LWP TTY          TIME CMD
  27110   27110 ?        00:00:01 gnome-terminal-
  27110   27111 ?        00:00:00 gmain
  27110   27113 ?        00:00:00 dconf worker
  27110   27114 ?        00:00:00 gdbus

두 창은 모두 동일한 스레드에 의해 처리됩니다.

27110 pid(대부분의 쉘에서 찾을 수 있음 getppid()) 를 갖는 것은 $PPID그다지 유용하지 않습니다. 이를 죽이면 결국 관리하는 모든 창을 종료하게 됩니다.

현재 창을 종료하려면 해당 창 내에서 종료하면 됩니다 cmd.

답변2

pathto/myprogram이 쉘 스크립트인 경우 환경 변수 '$PPID'를 사용할 수 있습니다.

[root@docker ~]# echo $PPID
20746
[root@docker ~]# ps auxw | grep 20746
root     20746  0.0  0.1 145696  5256 ?        Ss   10:38   0:00 sshd: root@pts/0
root     20825  0.0  0.0 112648   964 pts/0    R+   13:09   0:00 grep --color=auto 20746
[root@docker ~]#

관련 정보