2010-01-27 107 views
2

我有一段時間試圖編寫一個「終止所有其他守護進程」函數以便在bash守護進程中使用。我永遠不會想要一次運行多個守護進程。有什麼建議麼?這是我有:從同一個腳本中終止其他bash守護進程

#!/bin/bash 

    doService(){ 
     while 
     do 
     something 
     sleep 15 
     done 
    } 

    killOthers(){ 
     otherprocess=`ps ux | awk '/BashScriptName/ && !/awk/ {print $2}'| grep -Ev $$` 

     WriteLogLine "Checking for running daemons." 

     if [ "$otherprocess" != "" ]; then 
      WriteLogLine "There are other daemons running, killing all others." 
      VAR=`echo "$otherprocess" |grep -Ev $$| sed 's/^/kill /'` 
      `$VAR` 
     else 
      WriteLogLine "There are no daemons running."  
     fi 
     } 


     killOthers 
     doService 

它的作品有些時候,它不是別人。幾乎沒有任何一致。

回答

0

如果您runserviceunderrunit - 服務不能進叉的背景 - 你必須保證恰好有運行它的一個實例。如果服務沒有運行,或者它退出或崩潰,runit會啓動該服務,如果你問,請停止服務,並保留一個pid文件。

+0

嗯,不幸的是我沒有runit。我正在運行一個非devloper(沒有xcode工具)的vanilla OSX安裝。 – 2010-01-28 00:28:09

+0

它可能打包在某個地方,但我會讓osx用戶提供一個鏈接或等價物。 – Tobu 2010-01-28 00:40:58

+0

編輯了我的原始文章以反映這一點:此Apple Dev文檔看起來很有前途:http://developer.apple.com/mac/library/DOCUMENTATION/MacOSX/Conceptual/BPSystemStartup/Articles/StartupItems。html – monojohnny 2010-01-29 08:52:05

1

你可以在這裏嘗試舊的'鎖定文件'技巧嗎?測試一個文件:如果它不存在,創建它然後啓動;否則退出。

像:

#!/bin/bash 
LOCKFILE=/TMP/lockfile 
if [ -f "$LOCKFILE" ]; then 
     echo "Lockfile detected, exiting..." 
     exit 1 
fi 
touch $LOCKFILE 
while : 
do 
     sleep 30 
done 
rm $LOCKFILE # assuming an exit point here, probably want a 'trap'-based thing here. 

的缺點是,你必須鎖定文件清理不時,如果一個孤兒被拋在後面。

您可以將它轉換爲'rc'(或S */K *腳本?),以便您可以在inittab中指定'once'(或等效的方法 - 不確定在MacOS上)?

喜歡這裏所描述的那樣:

http://aplawrence.com/Unixart/startup.html

編輯:

可能這蘋果文檔可能有助於在這裏:​​

http://developer.apple.com/mac/library/DOCUMENTATION/MacOSX/Conceptual/BPSystemStartup/Articles/StartupItems.html

+0

我想讓最近調用的守護進程保持活動狀態。我不確定這個解決方案是否適合我的計劃。 – 2010-01-27 19:48:39

2

你已經消除當前進程ID使用grep -v,所以當你發出時沒有理由再次這樣做e kill。也沒有理由在變量中構建kill。只要做到:

kill $otherprocess 

但是,爲什麼不直接使用:

pkill -v $$ BashScriptName 

pkill -v $$ $0 

沒有任何的grep。

然後,你可以這樣做:

if [[ $? ]] 
then 
    WriteLogLine "Other daemons killed." 
else 
    WriteLogLine "There are no daemons running." 
fi 
+0

我沒有pkill選項... kill $ otherprocess似乎也不工作。 – 2010-01-27 19:47:37