Ответ 1
Другое решение:
function background {
echo TEST
}
export -f background
nohup bash -c background &
Я пытаюсь вызвать функцию с помощью 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 файл для моей функции. Как я могу это исправить?
Другое решение:
function background {
echo TEST
}
export -f background
nohup bash -c background &
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
Так как 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
будет вызыватьсяЯ нахожу для меня рабочее решение - определяю функцию в файле (например, .functions
), затем запускаю функцию с nohup:
nohup bash -c "source .functions; function1" &
Протестировано на Ubuntu 13.04.
Да! Это возможно, но сложно, и строго 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 устарел в пользу "объявить" (хотя я не совсем согласен с этим).