2013-05-08 34 views
10

Sto cercando di chiamare una funzione utilizzando nohup come questo:Chiamare una funzione usando nohup

function1(){ 
    while true 
    do 
     echo "function1" 
     sleep 1 
    done 
} 

nohup function1 & 
# ...... some other code 

, ma può essere la funzione non viene visto da nohup e ottengo questo errore:

nohup: failed to run command `function1' : No such file or dictionary 

Non voglio creare un nuovo file sh per la mia funzione. Come posso risolvere questo?

+0

nohup richiede come argomento un file (quello che dice chiaramente il messaggio di errore) non è una funzione. Ma quello che puoi fare è: modificare lo script sopra in modo che accetti un nuovo argomento (es. "--nohup"), quando questo argomento viene passato invoca 'function1' e sostituisci' nohup function1 & 'con' nohup $ 0 - nohup & 'nel tuo script –

+0

Vuoi dire che devo usare' nohup' nella funzione? Sono confuso dall'opzione '--nohup' che chiama la funzione! – sajad

+0

Possibile duplicato di [Come includere nohup all'interno di uno script bash?] (Https://stackoverflow.com/questions/6168781/how-to-include-nohup-inside-a-bash-script) – jww

risposta

6

nohup si applica ai comandi e non alle funzioni di script.

Ad esempio, lo script (diciamo func.sh) che contiene funzione1() deve chiamare il FUNCTION-:

function1(){ 
    while true 
    do 
     echo "function1" 
     sleep 1 
    done 

} 

function1 

oggi chiamiamo func.sh script con nohup nel background-:

nohup ./func.sh & 

Se è necessario disabilitare il segnale di blocco all'interno dello script, utilizzare lo shell integrato trap. L'esempio ignora SIGHUP ma può essere utilizzato per ignorare altri (ad esempio SIGINT).

trap "" HUP # script will ignore HANGUP signal 
+0

C'è comunque da applicare nohup sulle funzioni? Preferisco non usare più file sh. – sajad

+0

No purtroppo. Quello che potresti fare è mantenere le funzioni comuni in un unico script e poi inviarlo; questo ridurrebbe il numero di script. – suspectus

+2

C'è il comando trap che può essere usato per intercettare i segnali - vedi la mia risposta modificata. Questo potrebbe soddisfare le tue esigenze. – suspectus

3

Dal nohup deve essere alimentato con un non nome di una funzione come una soluzione questo è ciò che si può fare:

function1(){ 
    while true 
    do 
     echo "function1" 
     sleep 1 
    done 

} 

echo "[email protected]" | grep -q -- "--nohup" && function1 || nohup $0 "[email protected]" --nohup & 

Così, quando lo script viene chiamato con gli argomenti attuali:

  • `echo "[email protected]" | grep -q -- "--nohup" restituirà uno stato di errore così
  • nohup $0 "[email protected]" --nohup & verrà invocato, che sarà in Vokė questo script passando gli argomenti attuali e un nuovo argomento --nohup

E quando questo script viene chiamato con l'argomento --nohup

  • `echo "[email protected]" | grep -q -- "--nohup" tornerà con lo stato zero (di successo) in modo
  • function1 sarà invocato
2

Sì! E 'possibile comunque difficile, e rigorosamente bash> V2 compatibile:

function1(){ local msg=${*:-function1}; echo msg=$msg; } 
nohup -- sh -c "$(typeset -f function1); function1 MESSAGE" >nohup.log 2>&1 0</dev/null & 

E non dimenticate "comporre" è bash deprecato in favore di "dichiarare" (anche se non del tutto d'accordo con questo).

3

trovo una soluzione di lavoro per me - definire la funzione in un file (ad esempio .functions) quindi eseguire la funzione con nohup:

nohup bash -c "source .functions; function1" &

testato su Ubuntu 13.04.

9

Un'altra soluzione:

function background { 
    echo TEST 
} 
export -f background 

nohup bash -c background & 
+0

Questo è bello. Grazie per la condivisione. –