Как запустить часть сценария оболочки в режиме nohup? Мой сценарий выглядит так:
#!/bin/bash
command_1
script2.sh
script3.sh
...
(tests & loops, etc)
script4.sh
script5.sh
и я бы хотел запустить эту часть из script3.sh к script5.sh в режиме nohup без использования команды nohup или &, поэтому, если пользователь отключается, выполнение скрипта продолжается.
Не знаю, достаточно ли ясен мой вопрос :) Спасибо!
Основная цель nohup
чтобы изолировать программы от HUP
сигнал, обычно получаемый при отключении управляющего TTY (например, из-за выхода пользователя из системы).
Вы можете сделать то же самое с помощью встроенной команды оболочки trap
:
$ help trap
Trap signals and other events.
Defines and activates handlers to be run when the shell receives signals
or other conditions.
ARG is a command to be read and executed when the shell receives the
signal(s) SIGNAL_SPEC. If ARG is absent (and a single SIGNAL_SPEC
is supplied) or `-', each specified signal is reset to its original
value. If ARG is the null string each SIGNAL_SPEC is ignored by the
shell and by the commands it invokes.
Итак, вы можете использовать trap
команда, чтобы изолировать части вашего скрипта от HUP
signal, передав в качестве действия пустую строку. Например:
#!/bin/sh
command_1
script2.sh
# Starting ignoring HUP signal
trap "" HUP
script3.sh
...
(tests & loops, etc)
script4.sh
# Resume normal HUP handling.
trap - HUP
script5.sh
Вы, вероятно, захотите убедиться, что вывод вашего скрипта направляется в файл (иначе вы потеряете любой вывод после отключения, даже если скрипт продолжит работу).
Вы также можете подумать о том, чтобы просто запустить сценарий под управлением экран, поскольку это имеет то преимущество, что вы можете повторно подключиться к запущенному скрипту после отключения.
Как правило, не рекомендуется выходить из сценария, пока в нем все еще работают фоновые процессы.
Примените принцип KISS или «Будь проще, Сэм» (для различных значений Сэма). Вы понимаете nohup, просто используйте его.
Если вы хотите script3.sh
через script5.sh
и все условные выражения и циклы между ними для выполнения до завершения после того, как ваш скрипт вернется к приглашению оболочки, поместите этот раздел скрипта в отдельный файл.
Теперь у вас есть два сценария. Сначала сценарий script0.sh
#!/bin/bash
command_1
script2.sh
nohup script35.sh &
exit
script35.sh:
#! /bin/bash
script3.sh
...
(tests & loops, etc)
script4.sh
script5.sh
Если вы хотите запустить скрипт из cron, Зачем беспокоиться? Если вы начинаете с сеанса оболочки, следуйте совету @larsks и используйте эмулятор / мультиплексор терминала, например screen
или tmux
.