Как включить nohup в скрипт bash? - PullRequest
11 голосов
/ 29 мая 2011

У меня есть большой скрипт с именем mandacalc , который я хочу всегда запускать с помощью команды nohup . Если я вызываю это из командной строки как:

nohup mandacalc &

все идет быстро. Но если я попытаюсь включить nohup в свою команду, поэтому мне не нужно будет вводить ее каждый раз, когда я ее выполняю, я получаю сообщение об ошибке.

Пока я пробовал эти варианты:

nohup (
command1
....
commandn
exit 0
)

, а также:

nohup bash -c "
command1
....
commandn
exit 0
" # and also with single quotes.

Пока что я получаю только сообщения об ошибках с жалобами на реализацию команды nohup или на другие кавычки, используемые внутри скрипта.

веселит.

Ответы [ 5 ]

16 голосов
/ 29 мая 2011

Попробуйте поставить это в начале вашего скрипта:

#!/bin/bash

case "$1" in
    -d|--daemon)
        $0 < /dev/null &> /dev/null & disown
        exit 0
        ;;
    *)
        ;;
esac

# do stuff here

Если вы сейчас запустите свой скрипт с --daemon в качестве аргумента, он перезапустится сам, оторвавшись от текущей оболочки.

Вы по-прежнему можете запускать сценарий "на переднем плане", запустив его без этой опции.

4 голосов
/ 29 мая 2011

Создайте псевдоним с тем же именем в вашем файле запуска bash (или предпочитаемой оболочки):

alias mandacalc = "nohup mandacalc &"

3 голосов
/ 04 июля 2015

Здесь есть хороший ответ: http://compgroups.net/comp.unix.shell/can-a-script-nohup-itself/498135

#!/bin/bash

### make sure that the script is called with `nohup nice ...`
if [ "$1" != "calling_myself" ]
then
    # this script has *not* been called recursively by itself
    datestamp=$(date +%F | tr -d -)
    nohup_out=nohup-$datestamp.out
    nohup nice "$0" "calling_myself" "$@" > $nohup_out &
    sleep 1
    tail -f $nohup_out
    exit
else
    # this script has been called recursively by itself
    shift # remove the termination condition flag in $1
fi

### the rest of the script goes here
. . . . .
2 голосов
/ 29 мая 2011

Почему бы вам просто не сделать скрипт, содержащий nohup ./original_script?

1 голос
/ 11 июня 2013

Просто положите trap '' HUP в начало вашего сценария.

Также, если он создает дочерний процесс someCommand&, вам придется изменить их на nohup someCommand&, чтобы они работали должным образом ... Я изучал это в течение длительного времени и только комбинацию этих двух (ловушка и nohup) работает над моим конкретным скриптом, где xterm закрывается слишком быстро.

...