在多种终端可能同时运行的情况下,启动一个新终端,执行一个程序(例如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 ~]#