2013-09-23 3 views
8

나는 스크립트 자기 daemonizing을, 즉, 필요 쉘 프롬프트에서 수동으로 nohup $SCRIPT &>/dev/null &를 호출하지 할 수 있도록합니다. 이 현명하다자기 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

@Alfe 네 말이 맞아. 나는 큰 따옴표를 잊었다. 그 점을 지적 해 주셔서 감사합니다! – pepoluan

답변

8

여기 보이는 것들입니다.

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

또는

: == --daemonize?

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

대신 다시 스크립트를 호출 할 수

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

Shouln't, 당신은 단지 배경에 배치됩니다 서브 쉘을 소환 할 수

function daemon_mode { 
    Codes that run in daemon mode. 
} 

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

마지막 버전에서는 괄호가 필요 없습니다. &는 &로 인해 새 서브 쉘에서 기능이 실행됩니다. –

+0

오 예. 방금'function' 기능을 추가 했으므로별로 감사하지 않았습니다. – konsolebox

+0

아, 고마워! 네, 훨씬 더 우아 해 보입니다. '[[ "$ 1"! = - daemonize]]는 정확합니다. 기본적으로 스크립트가'--daemonize' 매개 변수를 사용하여 호출되지 않으면'--daemonize' 매개 변수를 전달하여 스크립트를 다시 시작합니다. 그러나 귀하의 솔루션이 훨씬 더 우아하다는 것을 알 수 있습니다. 따라서 테스트는 의미가 없습니다. 고맙습니다! – pepoluan