2013-05-08 26 views
10

Próbuję wywołać funkcję używając nohup tak:wywołania funkcji przy użyciu nohup

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

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

ale może być funkcja nie jest postrzegana przez nohup i otrzymuję ten błąd:

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

Nie chcę tworzyć nowego pliku sh dla mojej funkcji. Jak mogę to naprawić?

+0

nohup wymaga jako argument plik (co komunikat o błędzie wyraźnie mówi) nie jest funkcją. Ale możesz to zrobić: zmodyfikuj powyższy skrypt, aby zaakceptował nowy argument (np. "--nohup"), gdy ten argument zostanie przekazany, po prostu wywołaj 'function1' i zastąp' nohup function1 & 'z' nohup $ 0 - nohup i 'in your script –

+0

Masz na myśli, że muszę używać' nohup' w funkcji? Jestem zdezorientowany z powodu opcji '--nohup' wywołującej funkcję! – sajad

+0

Prawdopodobny duplikat [Jak uwzględnić nohup w skrypcie basha?] (Https://stackoverflow.com/questions/6168781/how-to-include-nohup-inside-a-bash-script) – jww

Odpowiedz

6

nohup dotyczy poleceń, a nie funkcji skryptowych.

Na przykład, skrypt (słownie func.sh), który zawiera Function1() powinna wywołać funk-:

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

} 

function1 

Teraz nazywamy func.sh skryptu z nohup w tle-:

nohup ./func.sh & 

Jeśli chcesz wyłączyć sygnał zawieszenia w skrypcie, użyj powłoki wbudowanej trap. Przykład ignoruje SIGHUP, ale może być używany do ignorowania innych (np. SIGINT).

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

Czy mimo to można zastosować nohup na temat funkcji? Wolę nie używać kilku plików sh. – sajad

+0

Nie, niestety. Co możesz zrobić, to zachować wspólne funkcje w jednym skrypcie, a następnie je pobrać; to zmniejszyłoby liczbę skryptów. – suspectus

+2

Istnieje polecenie pułapki, które można wykorzystać do przechwytywania sygnałów - zobacz moją zredagowaną odpowiedź. To może odpowiadać twoim wymaganiom. – suspectus

3

Od nohup muszą być dostarczane z nie pliku funkcję jako obejście tego jest to, co można zrobić:

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

} 

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

Więc kiedy ten skrypt zostanie wywołany z aktualnymi argumenty

  • `echo "[email protected]" | grep -q -- "--nohup" zwróci stan błędu, aby wywołać
  • nohup $0 "[email protected]" --nohup &, co spowoduje Voke tego skryptu przekazując bieżące argumenty i nowy argument --nohup

a gdy ten skrypt jest wywoływany z argumentem --nohup

  • `echo "[email protected]" | grep -q -- "--nohup" powróci z zerowym stanem (sukces) tak
  • function1 zostanie wywołany
2

Tak! Możliwe jest jednak trudne, a ściśle bash> v2 kompatybilny:

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

I nie zapomnij „przygotowana” jest bash zastąpiona „zadeklarować” (choć nie do końca zgadzam się z tym).

3

znajdę rozwiązanie działa dla mnie - Definiowanie funkcji w pliku (np .functions), a następnie uruchomić funkcję z nohup:

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

testowane na Ubuntu 13.04.

9

Innym rozwiązaniem:

function background { 
    echo TEST 
} 
export -f background 

nohup bash -c background & 
+0

To jest fajne. Dziękuję za udostępnienie. –

Powiązane problemy