我编写了一个简单的shell脚本如下:
#!/bin/bash
sleep 90运行此shell后,我在单独的shell中运行pstree,以查看进程树结构。
以下是我所看到的
-gnome-terminal-+-bash---sleepy.sh---sleep我以为这会是
-gnome-terminal-+-bash---bash---sleep为什么shell脚本由pstree表示为进程?ps命令正确地显示正在执行的命令
10150 8771 0 08:13 pts/1 00:00:00 /bin/bash ./sleepy.sh这里的过程是bash,sleepy.sh是它的论点(这对我来说是有意义的)。在我看来,进程必须是可执行的可执行格式二进制文件(ELF)。Bash是一个ELF可执行文件,但shell脚本不是,因此我认为pstree不应该这样显示它?
发布于 2016-11-15 16:21:44
pstree 检索进程名。/proc//stat.这是通过execve(2)的S第一个参数提供给内核的任何内容;详细信息请参见proc(5)和当我在外壳中执行一个文件时,会发生什么?。从后者可以看到内核可以直接运行shell脚本(以及许多其他“二进制文件”--参见莫诺有多神奇?),但在某些情况下,shell也会执行步骤。
因此,如果您运行
./sleepy.sh在脚本的开头有一个shebang行,您将看到sleepy.sh在pstree的S输出中,因为这是shell要求内核运行的。
sh ./sleepy.sh你会看到sh在pstree's的输出。
ps -f或ps u (和pstree -a)读取/proc/<pid>/cmdline来检索不同的命令行--这是给execve系统调用的argv参数。当使用shebang运行shell脚本时,它将被更改为包含shebang,这无疑是ps显示的原因。
/bin/bash ./sleepy.sh(有关这方面的更多信息,请参见程序如何运行 )。
https://unix.stackexchange.com/questions/323410
复制相似问题