gpt4 book ai didi

linux - Sudo - 等待 child ,并获取 child PID

转载 作者:太空狗 更新时间:2023-10-29 11:20:15 25 4
gpt4 key购买 nike

似乎在 sudo 1.7.2p2 和 1.7.4p5 之间的某个地方,等待执行进程的行为发生了变化。看起来在旧版本中 sudo 会启动新进程,然后退出。在较新的版本中,它启动新进程,然后等待它。这里有一些关于它的讨论:http://www.sudo.ws/pipermail/sudo-users/2010-August/004461.html其中提到它是为了阻止它破坏 PAM session 支持。

此更改破坏了我的一个脚本,该脚本使用 sudo 在后台执行命令,与旧版本 sudo 一样,我要执行的命令将在后台执行,而在新版本中,sudo 本身是后台执行的。

例如$!返回的过程在这种情况下是为了 sleep

user@localhost$ sudo -V
Sudo version 1.7.2p2
user@localhost$ sudo -u poweruser sleep 60 &
[1] 17491
user@localhost$ ps -fp $!
UID PID PPID C STIME TTY TIME CMD
poweruser 17491 17392 0 16:43 pts/0 00:00:00 sleep 60

而在这种情况下,它用于 sudo

user@localhost$ sudo -V
Sudo version 1.7.4p5
user@localhost$ sudo -u poweruser sleep 60 &
[1] 792
user@localhost$ ps -fp $!
UID PID PPID C STIME TTY TIME CMD
root 792 29257 0 16:42 pts/3 00:00:00 sudo -u poweruser sleep 60

sudo version 1.7.4p5 是否可以获取子进程的进程ID? $!变量返回 sudo 的 PID,使用 -b 选项运行 sudo 似乎不会使子 PID 可用。是否有可能(无需重新编译 sudo)恢复 sudo 的行为以阻止它等待子进程?

谢谢

最佳答案

这当然是一个 hack,它没有设置 $!,但你可以回显命令的 pid:

$ sudo sh -c 'echo $$; exec sleep 60'

我猜你对旧行为的解释不太正确,sudo 只是执行命令而不是 fork 和退出。回显 pid 然后执行所需的命令可能对您有用,但您可能需要创造性的重定向。例如:

#!/bin/shexec 3>&1pid=$( sudo sh -c 'echo $$; exec sh -c "{ sleep 1;    echo my pid is $$; }" >&3 &')echo Child pid is $pid

在上面,您丢失了 sudo 的 pid...但是找到它并不难。

关于linux - Sudo - 等待 child ,并获取 child PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9297637/

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