cof*_*Mug 3 linux terminal-emulator terminal shell-script processes
我曾经使用pstree类似于以下内容的内容来查找运行 shell 脚本的父模拟器的名称:
pstree -s $PPID | awk -F '---' '{print $6}'
这适用于我当前的系统。我测试过mate-terminal,xterm但不确定这是否适用于其他 Linux 系统/平台和其他终端。有没有更好/更整洁(更便携)的方法来实现这一目标?
ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"
Run Code Online (Sandbox Code Playgroud)
可能会给你带来好的结果。它给出了作为会话领导者的父进程的名称。对于在终端模拟器中启动的进程,这通常是运行该终端模拟器的进程(除非正在使用screen, expect, tmux... 之类的东西(但请注意,screen和tmux 是终端模拟器),或者使用setsid, start-stop-daemon..显式启动新会话。 .)
如果您发现嵌套括号难以阅读,您可以将其写成几行:
ps -o comm= -p "$((
$(
ps -o ppid= -p "$((
$(
ps -o sid= -p "$$"
)
))"
)
))"
Run Code Online (Sandbox Code Playgroud)
或者使用变量(这也有助于使脚本更易于解释):
sid=$(ps -o sid= -p "$$")
sid_as_integer=$((sid)) # strips blanks if any
session_leader_parent=$(ps -o ppid= -p "$sid_as_integer")
session_leader_parent_as_integer=$((session_leader_parent))
emulator=$(ps -o comm= -p "$session_leader_parent_as_integer")
Run Code Online (Sandbox Code Playgroud)
您还可以尝试解析wtmp终端模拟器通常在哪里记录一个条目,其 pid 与伪终端设备相关联。这适用于我在 Debian 系统上提供的 expect/screen/tmux... 不涉及:
ps -o comm= -p "$(
dump-utmp -r /var/log/wtmp |
awk -v tty="$(ps -o tty= -p "$$")" -F ' *\\| *' '
$2 == tty {print $5;exit}')"
Run Code Online (Sandbox Code Playgroud)
(使用dump-utmp来自 GNU acct)。
| 归档时间: |
|
| 查看次数: |
2403 次 |
| 最近记录: |