如何从终端本身运行的进程中了解终端模拟器的 PID

如何从终端本身运行的进程中了解终端模拟器的 PID

在多种终端可能同时运行的情况下,启动一个新终端,执行一个程序(例如gnome-terminal -e pathto/myprogram),现在myprogram需要弄清楚。明确地,gnome-terminal它正在运行的 PID 。如何才能做到这一点?

答案1

在终端或终端仿真器中运行的应用程序的输入/输出来自于/dev/ttysomething/dev/ptsomething设备文件。

在另一端(可能涉及一个或多个伪终端或串行线或 ssh/telnet/rsh 连接),某个物理终端、虚拟终端或模拟终端(可能用在浏览器窗口中运行的 javascript 编写)运行在某些本地或远程计算机将读取该输出以在屏幕上显示字符,并将您键入的内容作为字符发送以构成该输入。

如果你这样看,获得“pid”并不总是可能的或相关/有用的。您可能会获得一个 pid,但这可能是在另一台计算机上运行的 Web 浏览器的 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两次并运行pstree -slpa $$查看 shell 的祖先,我会看到:

$ 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

这是启动两个 s 的同一个进程zsh,即使它是多线程的:

$ 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(您可以在大多数 shell 中找到getppid()$PPID不会很有用。如果你杀死它,你最终会杀死它管理的所有窗口。

如果你想终止当前窗口,只需在 内退出即可cmd

答案2

如果pathto/myprogram是一个shell脚本,您可以使用环境变量'$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 ~]#

相关内容