2013-09-23 86 views
8

我想打一個腳本是自daemonizing,即無需手動調用nohup $SCRIPT &>/dev/null &在shell提示符。自daemonizing bash腳本

我的計劃是創建的代碼如下所示的部分:

#!/bin/bash 
SCRIPTNAME="$0" 

... 

# Preps are done above 
if [[ "$1" != "--daemonize" ]]; then 
    nohup "$SCRIPTNAME" --daemonize "${PARAMS[@]}" &>/dev/null & 
    exit $? 
fi 

# Rest of the code are the actual procedures of the daemon 

這是明智的?你有更好的選擇嗎?

+1

您應該使用雙至少引用'$ SCRIPTNAME'和'$ 1'的引號;否則,如果這些值中有空格,則會遇到麻煩。 – Alfe

+0

@你說得對。我忘了雙引號。感謝您指出了這一點! – pepoluan

回答

8

這是我看到的東西。

if [[ $1 != "--daemonize" ]]; then 

Shouln't這是== --daemonize?

nohup $SCRIPTNAME --daemonize "${PARAMS[@]}" &>/dev/null & 

而是再打電話給你的腳本,你可以只召喚,將其放置在後臺子shell:

(
    Codes that run in daemon mode. 
) </dev/null >/dev/null 2>&1 & 
disown 

或者

function daemon_mode { 
    Codes that run in daemon mode. 
} 

daemon_mode </dev/null >/dev/null 2>&1 & 
disown 
+2

上一版本中不需要括號。由於&,函數將在新的子shell中運行。 –

+0

哦,是的。我只是添加了'功能'功能,所以我沒有注意到它非常感謝。 – konsolebox

+0

啊,謝謝!是的,看起來更優雅。 '[[「$ 1」!= --daemonize]]'是正確的。基本上,如果腳本不是使用'--daemonize'參數調用的,它將通過'--daemonize'參數重新啓動。不過,我可以看到你的解決方案更加優雅,所以測試是沒有意義的。謝謝! – pepoluan