首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么pstree显示我的脚本的名称而不是解释它的shell的名称?

为什么pstree显示我的脚本的名称而不是解释它的shell的名称?
EN

Unix & Linux用户
提问于 2016-11-15 13:01:44
回答 1查看 897关注 0票数 3

我编写了一个简单的shell脚本如下:

代码语言:javascript
复制
#!/bin/bash
sleep 90

运行此shell后,我在单独的shell中运行pstree,以查看进程树结构。

以下是我所看到的

代码语言:javascript
复制
-gnome-terminal-+-bash---sleepy.sh---sleep

我以为这会是

代码语言:javascript
复制
-gnome-terminal-+-bash---bash---sleep

为什么shell脚本由pstree表示为进程?ps命令正确地显示正在执行的命令

代码语言:javascript
复制
10150  8771  0 08:13 pts/1    00:00:00 /bin/bash ./sleepy.sh

这里的过程是bash,sleepy.sh是它的论点(这对我来说是有意义的)。在我看来,进程必须是可执行的可执行格式二进制文件(ELF)。Bash是一个ELF可执行文件,但shell脚本不是,因此我认为pstree不应该这样显示它?

EN

回答 1

Unix & Linux用户

发布于 2016-11-15 16:21:44

pstree 检索进程名。/proc//stat.这是通过execve(2)的S第一个参数提供给内核的任何内容;详细信息请参见proc(5)当我在外壳中执行一个文件时,会发生什么?。从后者可以看到内核可以直接运行shell脚本(以及许多其他“二进制文件”--参见莫诺有多神奇?),但在某些情况下,shell也会执行步骤。

因此,如果您运行

代码语言:javascript
复制
./sleepy.sh

在脚本的开头有一个shebang行,您将看到sleepy.shpstree的S输出中,因为这是shell要求内核运行的。

代码语言:javascript
复制
sh ./sleepy.sh

你会看到shpstree's的输出。

ps -fps u (和pstree -a)读取/proc/<pid>/cmdline来检索不同的命令行--这是给execve系统调用的argv参数。当使用shebang运行shell脚本时,它将被更改为包含shebang,这无疑是ps显示的原因。

代码语言:javascript
复制
/bin/bash ./sleepy.sh

(有关这方面的更多信息,请参见程序如何运行 )。

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/323410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档