Какой самый простой способ «отсоединить / демонизировать» скрипт Bash? - PullRequest
15 голосов
/ 06 декабря 2010

Я пытаюсь написать Bash-скрипт , который спит в течение определенного промежутка времени, прежде чем использовать команду mac say для произнесения текста.

Я хотел бы иметь возможность выполнить команду и затем закрыть терминал, чтобы он продолжал говорить в установленное время.Я рассмотрел nohup, detach, launchd и перевел процесс в фоновый режим, но все эти решения по-прежнему приводят к завершению процесса после закрытия терминала.Должен ли я каким-то образом сделать какой-то процесс зомби-ребенка, чтобы сделать это?Какое лучшее решение?Спасибо

# Simple Example of main code
sleep 10;
say hello;
exit;

Ответы [ 8 ]

12 голосов
/ 06 декабря 2010

Раздел 3.7.6 Руководства по Bash гласит:

Оболочка по умолчанию закрывается при получении SIGHUP.Перед выходом интерактивная оболочка отправляет SIGHUP всем работам, запущенным или остановленным.Остановленные задания отправляются SIGCONT, чтобы гарантировать получение SIGHUP.Чтобы предотвратить отправку оболочкой сигнала SIGHUP на конкретное задание, его следует удалить из таблицы заданий с помощью встроенной команды disown (см. Раздел 7.2 [Встроенные средства управления заданиями], стр. 88) или отметить, что она не получает сигнал SIGHUP с помощью disown -h.

Таким образом, использование nohup или disown должно помочь.Или вы можете сделать:

trap "" 1
sleep 10
say hello

Эта строка 'trap' игнорирует сигнал 1, SIGHUP;Вы также можете написать 'trap "" HUP ".

11 голосов
/ 06 декабря 2010
nohup yourscript.sh 10 "hello" &

#     ^your script  ^^your parameter 1
#                      ^^^^^^^your parameter 2

Это отсоединит скрипт от терминала и не будет убит при закрытии терминала. Обратите внимание на & в конце; вы можете передавать параметры в ваш скрипт в обычном режиме. Тогда yourscript.sh может быть:

#!/bin/bash

sleep $1;
say "$2";
exit;
6 голосов
/ 06 декабря 2010

Вам нужно использовать nohup и background вместе.Я только что попробовал это на OS-X, чтобы убедиться, что он работает:

nohup ./say-hello.sh &
3 голосов
/ 06 декабря 2010

Если вы не начнете с nohup, как уже предлагалось, вам нужно будет использовать disown как таковое ...

$ ./say-hello.sh &
[1] 12345
$ disown -h %1

Вам нужно будет записать номер задания (вторая строка в приведенном выше примере, номер задания указан в скобках, а другая - идентификатор процесса), чтобы вы могли передать его в disown.

2 голосов
/ 06 декабря 2010

Ваш скрипт может выглядеть так:

#!/bin/bash
read -p "Text: " text
read -p "Delay: " delay
nohup bash -c "sleep $delay; say \"$text\" &"

Тогда вы бы нормально запустили свой скрипт:

$ your_script
Text: hello
Delay: 10

и внешний скрипт завершится, но Sleep&Say™ останется запущенным в фоновом режиме.

1 голос
/ 31 марта 2017

Все решения здесь очень хороши, но они не предоставляют простой способ «посмотреть», что происходит в программе, без перенаправления, которое заполнило бы жесткий диск.

Использование screenтогда вы можете очень легко запустить скрипт, закрыть сеанс терминала / ssh, а затем вернуться к последнему и снова «присоединить» к скрипту.Сделать это довольно просто.

Установить

Сначала установить screen:

sudo apt-get install screen

Отсоединить

, а затем поместить в файл bash

#!/usr/bin/env bash
screen -S myscreen -d -m bash -c 'ls; exec bash'

(замените ls вашей программой). Он создаст (-S) «экран» с именем myscreen и отсоединит его (-d), выполнив команды внутри ``опция -c```.Затем, если вы хотите подключиться позже к этому экрану:

И присоединить позже

screen -rd myscreen

, если вы хотите отобразить список всех запущенных экранов:

screen -ls

Примечание:если вы хотите закрыть экран после его завершения, удалите bash в конце команды.

0 голосов
/ 07 декабря 2010

В зависимости от вашего определения 'легкий' ответ может быть демон .

0 голосов
/ 06 декабря 2010

Используйте nohup yourscript.sh &, как предложил Писквор.

Однако учтите, что вы не сможете восстановить «контроль» над своим процессом. Поэтому, если вам это нужно, я предлагаю добавить запись в файл, чтобы вы знали, что делает ваша программа.

Убить вашу программу невозможно без kill -9, и это может быть немного жестоко. Если вы этого не хотите, я бы рекомендовал объединять файлы, например end.txt, каждую минуту или около того. Если ваша программа обнаруживает присутствие такого файла в своем рабочем каталоге, она должна завершиться корректно.

...