2014-09-02 88 views
0

推出,過程我都在啓動(/etc/init.d/boot.local)推出fooinit.rt過程廣東話終止它在啓動時在後臺

這裏是boot.local在文件

... 
/bin/fooinit.rt & 
... 

我在作業中創建一個訂單列表以殺死fooinit.rt。即在C代碼

觸發我寫(中)停止腳本殺死-9的pidof fooinit.rt寫入 這裏被停止腳本

#!/bin/sh 
proc_file="/tmp/gdg_list$$" 
ps -ef | grep $USER > $proc_file 
echo "Stop script is invoked!!" 
suff=".rt" 
pid=`fgrep "$suff" $proc_file | awk '{print $2}'` 
echo "pid is '$pid'" 
rm $proc_file 

當工作定時器超時「殺-9 pid'(of fooinit.rt)命令不能終止fooinit.rt進程!

我檢查了打印出的pid編號,並輸入了句子「Stop script is invoked !!」是好的!

這裏是「在」 C代碼作業命令(我覈實,後來經過1分鐘停止scriptis叫)

... 
case 708: /* There is a trigger signal here*/ 
{ 
    result = APP_RES_PRG_OK; 
    system("echo '/sbin/stop' | at now + 1 min"); 

} 
... 

在另一方面,它可以正常工作的情況下,手動啓動fooinit.rt從shell作爲一個普通的命令。 (而不是從/etc/init.d/boot.local)。所以殺-9工作,並終止fooinit.rt過程

你有任何想法,爲什麼殺-9不能終止foo.rt過程中,如果它是從/etc/init.d/boot.local

回答

0

推出您的解決方案是圍繞競爭條件建立的。不能保證它會殺死正確的進程(在ps調用和嘗試使用pid之間可能會傳遞不可知的時間),而且它也容易受到tmp的攻擊:某人可以創建幾千個符號鏈接/ tmp調用「gdg_list [1-32767]」指向/ etc/shadow,如果以root用戶身份運行,腳本會覆蓋/ etc/shadow。

另一個潛在的問題是設置$USER - 你確定它是正確的嗎?你的工作將作爲你的C程序運行的用戶來調用,它可能不是你的fooinit.rt運行的用戶。

此外,您的腳本根本不包含kill命令。

這樣做的更簡潔的方法是在runit等進程管理器下運行fooinit.rt,並在不再需要時使用runit將其關閉。這避免了pid賓果以及/ tmp攻擊向量。

但即使使用pkill -u username -f fooinit.rt也不會比您提供的腳本活躍。

+0

我已經解決了這個問題。 「另一個潛在的問題是$ USER的設置 - 你確定它是正確的嗎?」這是賓果!!謝謝。 – roll 2014-09-04 09:57:49

+0

儘管我的c代碼進程(in)在部署作業時以root用戶身份出現在ps -ef上,但當我將此代碼添加到停止腳本時(echo「User is'$ USER'」>> $ proc_file),它不會打印任何內容。這裏是輸出 - >用戶是'' – roll 2014-09-04 10:07:29

+0

在啓動進程的情況下,fooinit.rt,invoke.rt(在部署作業時),從shell手動輸出 - >用戶是'root'。並停止腳本正常工作! – roll 2014-09-04 10:12:41