Назад | Перейти на главную страницу

Запустить часть оболочки скрипта в nohup

Как запустить часть сценария оболочки в режиме 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.