在阅读有关 Linux 的文章时,我得到了:
默认情况下,脚本中创建的变量仅对当前 shell 可用;子进程(子 shell)将无法访问已设置或修改的值。要允许子进程查看这些值,需要使用 export 命令。
我尝试查找有关子壳的信息,然后我偶然发现了是否有任何命令可以查看进程如何工作?,我发现 ltrace 可以用于此,当我搜索如何使用ltrace
或时strace
,我发现这PID
是必需的属性。
现在,如果我想知道 PID $ cp file1 file2
,我该怎么做?以便我可以使用ltrace
它?
答案1
电流指令PID
当您在后台启动命令时,会显示您自己的 shell 中的命令的 PID。如果当前命令在前台运行,shell 通常会等待它完成,我们也必须等待 - 除非我们想使用此 shell 之外的工具;请参阅下面的选项。
作为示例命令,我将使用这个ping
命令每 5 秒发送一次请求,共 10 次:
ping -i 5 -c 10 example.com
现在,我将使用&
它在后台运行:
$ ping -i 5 -c 10 example.com &
[1] 12238
$ PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=55 time=118 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=55 time=117 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=55 time=117 ms
告诉[1] 12238
我们该进程的进程 ID 为短 PID 12238;并且它是当前在此 shell 中运行的第一个后台作业。
示例:跟踪库调用
在同一个终端中我们得到了输出ping
,所以我们最好在另一个终端中运行 ltrace(ping
具有特殊的 root 权限,因此我们需要sudo
弄乱其内部):
$ sudo ltrace -p 12238
[sudo] password for siegel:
gettimeofday(0x7fff7f0b6900, 0) = 0
gettimeofday(0x7fff7f0b68e0, 0) = 0
sendmsg(3, 0x60a300, 2048, 24) = 64
recvmsg(3, 0x7fff7f0b6970, 0, 0) = 84
__printf_chk(1, 0x40813b, 64, 0x60a560) = 29
__printf_chk(1, 0x4077ea, 4, 28) = 11
__printf_chk(1, 0x40814d, 55, 11) = 7
__printf_chk(1, 0x408162, 118, 7) = 12
_IO_putc('\n', 0x7f7836d89400) = 10
fflush(0x7f7836d89400) = 0
gettimeofday(0x7fff7f0b6900, 0) = 0
poll(0x7fff7f0b6950, 1, 4880, 0) = 0
gettimeofday(0x7fff7f0b6900, 0) = 0
gettimeofday(0x7fff7f0b68e0, 0) = 0
sendmsg(3, 0x60a300, 2048, 24) = 64
recvmsg(3, 0x7fff7f0b6970, 0, 0) = 84
__printf_chk(1, 0x40813b, 64, 0x60a560) = 29
__printf_chk(1, 0x4077ea, 5, 28) = 11
__printf_chk(1, 0x40814d, 55, 11) = 7
__printf_chk(1, 0x408162, 118, 7) = 12
_IO_putc('\n', 0x7f7836d89400) = 10
fflush(0x7f7836d89400) = 0
gettimeofday(0x7fff7f0b6900, 0) = 0
poll(0x7fff7f0b6950, 1, 4881, 0)
这是两次“ping”期间库调用的踪迹。
查找正在运行的进程的 PID
由于标题问题不是很具体,这里还有一些其他方法来查找当前正在运行的命令的 PID:
按命令名称搜索进程
pgrep -x cmd
请注意,变体pgrep cmd
是错误的:它作为子字符串通过带参数的命令行搜索
pgrep -f cmdarg
列出属于当前 shell(会话)的进程,如后台进程或 shell 本身
ps -s $$
列出所有进程:“进程状态”
ps aux
以更具交互性的方式列出进程:“进程表”
top
您一次性获得所需的一切:一个与 和 集成的流程表:
ltrace
它strace
是
htop
的变体,top
具有增强的用户界面和可配置性,以及一些附加功能:
用光标行选择一个流程,然后L按ltrace
或!sstrace
答案2
bash
,dash
(以及许多其他 shell)都有用于作业控制的内置命令。如果你在后台运行命令
sleep 9999 &
你可以发现当前shell的所有后台命令:
$ jobs
[1]+ Running sleep 9999 &
如果您需要其中一个进程的进程 ID,可以使用 来获取jobs -p %N
,其中N
是上面作业列表(第一列)中的作业 ID。还有一个特殊变量$!
,shell 将用最近在后台执行的命令的 PID 替换它。
有关详细信息和更多选项,请参阅手册的相关部分bash(1)
(直接链接到 HTML 版本中的作业控制部分),dash(1)
或您选择的 shell。TLDP 有一个很棒的作业控制部分也一样。