2012-02-15 88 views
3

似乎介於sudo 1.7.2p2和1.7.4p5之間的等待執行過程的行爲已經改變。它看起來像在舊版本中,sudo會開始新的過程,然後退出。在較新的版本中,它開始新的過程,然後等待它。這裏有一些討論:http://www.sudo.ws/pipermail/sudo-users/2010-August/004461.html其中提到它阻止它打破PAM會話支持。Sudo - 等待孩子,並得到孩子PID

這個改變破壞了我的一個腳本,它使用sudo在後臺執行命令,就像使用舊版本的sudo一樣,我想要執行的命令會背景化,而新版本是sudo本身就是後臺。

例如,由$!返回的過程在這種情況下是睡眠

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

而在這種情況下,它是須藤

[email protected]$ sudo -V 
Sudo version 1.7.4p5 
[email protected]$ sudo -u poweruser sleep 60 & 
[1] 792 
[email protected]$ 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 

是否有可能得到的進程ID通過sudo的1.7版執行的子進程。 4P5? $!變量返回sudo的PID,並且使用-b選項運行sudo似乎不會使子PID可用。是否有可能(無需重新編譯sudo)來恢復sudo的行爲以阻止它等待子進程?

感謝

回答

1

這無疑是一個黑客,它不設置$!但你可以重複命令的PID:

 
$ sudo sh -c 'echo $$; exec sleep 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 

在上面,你失去了sudo的PID ...但它不會太難找到它。

+0

感謝威廉。 我其實只需要將pid存儲在一個文件中,所以我的重定向並不那麼有創意。 我結束了這樣的事情: 'sudo -u poweruser sh -c「echo \ $ \ $> $ {pid_file}; exec sleep 60」&' – nickelaway 2012-02-20 15:23:53

+0

嗨,試過你的代碼,我不斷收到'sh :1:3:錯誤的文件描述符錯誤。我究竟做錯了什麼? – 2013-10-27 16:04:29

+0

@Frederick'exec 1>&3'可能會給出你描述的錯誤,因爲沒有提供'exec'。 – 2013-10-28 12:22:35