2013-09-23 24 views
8

bir senaryo kendinden Daemonizing, yani gerek kabuk istemi üzerine elle nohup $SCRIPT &>/dev/null & çağırmak olmak yapmak istiyorum. Bu akıllıca mıKendinden Daemonizing bash komut

#!/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 

:

Planım şu gibi bir kod bölümünü oluşturmaktır? Daha iyi alternatifleriniz var mı?

+1

Çift kullanmalısınız en az $ SCRIPTNAME ve $ 1 $ civarında tırnak; Aksi takdirde, bu değerlerde boşluk varsa, sorun yaşarsınız. – Alfe

+0

@Alfe Haklısınız. Çift tırnakları unuttum. Bunu işaret ettiğin için teşekkürler! – pepoluan

cevap

8

İşte gördüğüm şeyler.

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

Ya

: == --daemonize?

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

yerine tekrar Senaryonu çağıran olmak

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

shouln't, sadece bir arka planda yerleştirmiş bir altkabuk çağırmak

function daemon_mode { 
    Codes that run in daemon mode. 
} 

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

Son sürümde parantezlere gerek yoktur. Fonksiyon yeni alt kabuğunda zaten çalışacaktır çünkü &. –

+0

Oh evet. Ben sadece 'function' özelliğini ekledim, bu yüzden çok fazla bir şey fark etmedim. – konsolebox

+0

Ah, teşekkürler! Evet bu daha zarif görünüyor. '[[" $ 1 "! = --daemonize]]' doğrudur. Temel olarak, betik '--daemonize' parametresi kullanılarak çağrılmıyorsa,' --daemonize' parametresini geçerek kendini yeniden başlatır. Bununla birlikte, çözümünüzün çok daha zarif olduğunu görebiliyorum, bu yüzden test tartışmalı. Teşekkür ederim! – pepoluan