여러 터미널이 동시에 실행되고 새 터미널을 시작하고 프로그램(예: 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 ~]#