gpt4 book ai didi

linux - sh -c "ps -l"在linux中是什么意思?

转载 作者:太空宇宙 更新时间:2023-11-04 04:47:11 24 4
gpt4 key购买 nike

我的命令解释器是 bash shell。在我的操作系统(cent OS)上打开终端后,我执行了以下命令:

场景 1

$sh -c "ps -l"
UID PID PPID TIME CMD
3038 2577 2504 00:00:00 bash
3038 2992 2577 00:00:00 ps

场景 2

$sh    
$ps -l
UID PID PPID TIME CMD
3038 2577 2504 00:00:00 bash
3038 3005 2577 00:00:00 sh
3038 3006 3005 00:00:00 ps

观察ps的PID和PPID。
在场景 1 中,我在 sh shell 上执行 ps -l 命令。所以它的父级应该是sh,即它的PPID应该是sh的PID。但是 ps -l 命令列出了它的父级是 bash。我不明白到底发生了什么。我了解场景 1场景 2 之间的区别。但是,当我在另一个操作系统(ubuntu)上执行相同的命令时,我在场景3场景4中的ps -l下得到相同的列表,如下所示:

场景3

$sh    
$ps -l
UID PID PPID TIME CMD
3038 2577 2504 00:00:00 bash
3038 2991 2577 00:00:00 sh
3038 2992 2991 00:00:00 ps

场景 4

$sh    
$ps -l
UID PID PPID TIME CMD
3038 2577 2504 00:00:00 bash
3038 3005 2577 00:00:00 sh
3038 3006 3005 00:00:00 ps

在这两种情况下,我都将 ps CMD 的 PPID 作为 sh 的 PID。究竟发生了什么。难道我的理解有误吗?

最佳答案

当您键入命令时,bash 只是fork,然后execve 该命令。场景3和场景4就是这种情况。

sh -c 'ps -l' 取决于 shell。

在我的 Linux 发行版上,ls -l `which sh` 的结果是lrwxrwxrwx 1 root root 4 Oct 6 14:06/usr/bin/sh -> bash

-c存在时,bash直接execve以下命令。而像 fish 这样的另一个 shell 则不然。

鱼 -c 'ps -l'
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 711 710 0 80 0 - 5707 等待 pts/5 00:00:00 bash
0 S 1000 1519 711 0 80 0 - 7054 等待 pts/5 00:00:00 鱼
0 R 1000 1526 1519 0 80 0 - 9266 - 点/5 00:00:00 ps

execve 的作用是用新的进程镜像替换当前进程镜像。fork 创建一个新进程。

关于linux - sh -c "ps -l"在linux中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27854978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com