Вызов функции с помощью nohup

Я пытаюсь вызвать функцию с помощью nohup следующим образом:

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

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

но может быть функция не видна nohup, и я получаю эту ошибку:

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

Я не хочу создавать новый sh файл для моей функции. Как я могу это исправить?

Ответ 1

Другое решение:

function background {
    echo TEST
}
export -f background 

nohup bash -c background &

Ответ 2

nohup применяется к командам, а не к функциям script.

Например, script (скажем func.sh), который содержит функцию1(), должен вызывать функцию -:

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

}

function1

Теперь вызовите script func.sh с nohup в фоновом режиме -:

nohup ./func.sh &

Если вам нужно отключить сигнал зависания из script, используйте встроенную оболочку trap. В примере игнорируется SIGHUP, но может использоваться для игнорирования других (например, SIGINT).

trap "" HUP   # script will ignore HANGUP signal

Ответ 3

Так как nohup должно быть снабжено именем файла, а не функцией в качестве обходного пути, это то, что можно сделать:

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

}

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

Итак, когда этот script вызывается с текущими аргументами:

  • `echo "[email protected]" | grep -q -- "--nohup" вернет статус ошибки, чтобы
  • nohup $0 "[email protected]" --nohup &, который вызовет этот script, передающий текущие аргументы и новый аргумент --nohup

И когда этот script вызывается с аргументом --nohup

  • `echo "[email protected]" | grep -q -- "--nohup" вернется с нулевым статусом (успех), поэтому
  • function1 будет вызываться

Ответ 4

Я нахожу для меня рабочее решение - определяю функцию в файле (например, .functions), затем запускаю функцию с nohup:

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

Протестировано на Ubuntu 13.04.

Ответ 5

Да! Это возможно, но сложно, и строго bash > v2 совместимо:

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

И не забывайте, что "наборщик" bash устарел в пользу "объявить" (хотя я не совсем согласен с этим).