2013-05-08 13 views
10

I nohup wie diese eine Funktion aufzurufen, indem ich versuche:Aufruf einer Funktion mit nohup

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

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

aber kann die Funktion nicht von nohup gesehen, und ich bekomme diese Fehlermeldung:

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

Ich möchte keine neue SH-Datei für meine Funktion erstellen. Wie kann ich das beheben?

+0

nohup erfordert als Argument eine Datei (was die Fehlermeldung sagt klar) keine Funktion. Aber was Sie tun können, ist: Ändern Sie das obige Skript so, dass es ein neues Argument akzeptiert (zB "--nohup"), wenn dieses Argument übergeben wird, rufen Sie einfach 'function1' auf und ersetzen' nohup function1 & 'durch' nohup $ 0 - nohup & 'in Ihrem Skript –

+0

Sie meinen, ich muss' nohup' in der Funktion verwenden? Ich bin verwirrt über die "--nohup" -Option, die die Funktion aufruft! – sajad

+0

Mögliches Duplikat von [Wie nohup in ein Bash-Skript einzubinden?] (Https://stackoverflow.com/questions/6168781/how-to-include-nohup-inside-a-bash-script) – jww

Antwort

6

nohup gilt für Befehle und nicht für Skriptfunktionen.

Zum Beispiel das Skript (zB func.sh), der enthält function1() sollte die funktions- nennen:

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

} 

function1 

Jetzt mit nohup im Hintergrund- das Skript func.sh nennen:

nohup ./func.sh & 

Wenn Sie das Aufhängungssignal innerhalb des Skripts deaktivieren müssen, verwenden Sie die integrierte Shell trap. Das Beispiel ignoriert SIGHUP, kann aber verwendet werden, um andere zu ignorieren (z. B. SIGINT).

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

Gibt es trotzdem zutreffen Nohup auf die Funktionen? Ich bevorzuge es, nicht mehrere SH-Dateien zu verwenden. – sajad

+0

Nein, leider. Was Sie tun könnten, ist, gemeinsame Funktionen in einem einzigen Skript zu behalten und es dann zu finden; das würde die Skriptanzahl reduzieren. – suspectus

+2

Es gibt den Trap-Befehl, mit dem Signale abgefangen werden können - siehe meine bearbeitete Antwort. Dies kann Ihren Anforderungen entsprechen. – suspectus

3

Da nohup muss mit einem Dateinamen geliefert wird keine Funktion als Behelfslösung das ist, was getan werden kann:

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

} 

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

Also, wenn dieses Skript wird mit den aktuellen Argumenten aufgerufen:

  • `echo "[email protected]" | grep -q -- "--nohup" wird einen Fehlerstatus zurückgeben, so
  • nohup $0 "[email protected]" --nohup & wird aufgerufen werden, die in Voke dieses Skript die aktuellen Argumente und ein neues Argument übergeben --nohup

Und wenn dieses Skript mit dem Argument --nohup

  • `echo "[email protected]" | grep -q -- "--nohup" kehrt mit Null-Status (Erfolg) so
  • function1 wird aufgerufen aufgerufen wird
2

Ja! Es ist möglich, aber heikel, und streng bash> v2 kompatibel:

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

Und nicht vergessen „setzt“ wird bash als veraltet zu Gunsten der „erklären“ (obwohl ich ganz nicht damit einverstanden ist).

3

finde ich eine funktionierende Lösung für mich - definiert die Funktion in einer Datei (z .functions) dann die Funktion mit nohup laufen:

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

Getestet auf Ubuntu 13.04.

9

Eine andere Lösung:

function background { 
    echo TEST 
} 
export -f background 

nohup bash -c background & 
+0

Das ist cool. Danke für das Teilen. –

Verwandte Themen