Linux Sudo-等待孩子,并获得孩子PID

Linux Sudo-等待孩子,并获得孩子PID,linux,bash,background,process,sudo,Linux,Bash,Background,Process,Sudo,似乎在sudo1.7.2p2和1.7.4p5之间的某个地方,等待执行进程的行为发生了变化。在旧版本中,sudo似乎会启动新进程,然后退出。在较新的版本中,它启动新进程,然后等待它。这里有一点关于它的讨论:它提到它是为了阻止它破坏PAM会话支持 这个改变打破了我的一个脚本,它使用sudo在后台执行命令,就像旧版本sudo一样,我想要执行的命令是后台的,而新版本的sudo本身是后台的 例如,$返回的进程!在这种情况下是为了睡觉 然而,在这种情况下,它是为sudo 是否可以获取sudo版本1.7.4p

似乎在sudo1.7.2p2和1.7.4p5之间的某个地方,等待执行进程的行为发生了变化。在旧版本中,sudo似乎会启动新进程,然后退出。在较新的版本中,它启动新进程,然后等待它。这里有一点关于它的讨论:它提到它是为了阻止它破坏PAM会话支持

这个改变打破了我的一个脚本,它使用sudo在后台执行命令,就像旧版本sudo一样,我想要执行的命令是后台的,而新版本的sudo本身是后台的

例如,$返回的进程!在这种情况下是为了睡觉

然而,在这种情况下,它是为sudo

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


谢谢

这当然是一个黑客行为,它不会设置$!,但您可以回显命令的pid:

$ sudo sh -c 'echo $$; exec sleep 60' $sudo sh-c'echo$$;高级睡眠60' 我猜你对旧行为的解释不太正确,sudo只是执行命令,而不是分叉和退出。回显pid,然后执行所需的命令可能适合您,但您可能需要创造性的重定向。例如:

#!/bin/sh exec 3>&1 pid=$( sudo sh -c 'echo $$; exec sh -c "{ sleep 1; echo my pid is $$; }" >&3 &') echo Child pid is $pid #!/垃圾箱/垃圾箱 执行3>&1 pid=$(sudo sh-c'echo$;exec sh-c{sleep 1; 回显我的pid为$$;}“>&3&”) echo子pid为$pid
在上面的例子中,你失去了sudo的pid……但要找到它并不难。

谢谢威廉。实际上,我只需要将pid存储在一个文件中,所以我的重定向不是很有创意。我最终得到了这样的结果:
sudo-upoweruser sh-c“echo\$\$>${pid\u file};exec sleep 60”&
Hi,尝试了你的代码,我不断收到
sh:1:3:错误的文件描述符
错误。我做错了什么?@Frederick
exec 1>&3
很可能会给出您所描述的错误,正如未能提供
exec
一样。 $ sudo sh -c 'echo $$; exec sleep 60' #!/bin/sh exec 3>&1 pid=$( sudo sh -c 'echo $$; exec sh -c "{ sleep 1; echo my pid is $$; }" >&3 &') echo Child pid is $pid