Я хотел бы запустить и настроить процесс аналогично демону из скрипта.
Моя оболочка эмулируется Zsh под Cygwin, а демон - SFK , базовый FTP-сервер.
Что важно здесь, сценарий startserv.sh
может быть составлен следующим образом:
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &
После запуска сценария startserv.sh
он останавливается (заканчивается?), Не показывая никаких подсказок, затем:
CTRL+ Cзавершает как скрипт, так и процесс фоновой работы;
Удар Enterпо сценарию завершает процесс, остается в фоновом режиме.
В любом случае, я вижу это только через, ps
а не через jobs
, поэтому, когда я хочу закрыть процесс, я должен послать жестокий kill -9
сигнал, чего я хотел бы избежать в пользу CTRL+ C.
Альтернативой будет запуск всего скрипта в фоновом режиме. «Будет», но read
команда не может получить пользовательский ввод, если скрипт запускается как startserv.sh &
.
Обратите внимание, что мне нужен эфемерный сервер, а не настоящий демон : то есть я хочу, чтобы серверный процесс выполнялся в фоновом режиме, после завершения сценария, для выполнения простых задач интерактивной оболочки (с гостем виртуальной машины), но я не t нужен процесс, чтобы выжить в раковине; поэтому nohup
кажется не уместным.
bgproc="$!"
а затемcommand "$bgproc"
выполнить соответствующее действие. См. Также stackoverflow.com/questions/1908610/…Ответы:
Почти! На самом деле, сценарий уже завершился к тому времени, когда вы нажимаете Enter. Тем не менее, вы можете получить подсказку обратно (поскольку ваша оболочка печатает
$PS1
заново).Причина, по которой нажатие Ctrl+ Cзавершает их обоих, заключается в том, что они оба связаны. Когда вы выполняете свой скрипт, ваша оболочка запускает подоболочку, в которой он запускается. Когда вы завершаете эту подоболочку, ваш фоновый процесс умирает, вероятно, от
SIGHUP
сигнала.Отдельный скрипт, фоновый процесс и подоболочка
Используя
nohup
, вы сможете избавиться от этого небольшого неудобства.disown
альтернативаЕсли вы можете переключиться с
/bin/sh
на/bin/bash
, вы также можете попробоватьdisown
. Чтобы узнать больше, просто наберитеhelp disown
вbash
экземпляре.Убить фоновый процесс "красиво"
Теперь, когда дело доходит до уничтожения вашего процесса, вы можете отлично использовать знак « Ctrl+ C»
kill
. Только не присылай жестокоеSIGKILL
. Вместо этого вы можете использовать:Который отправит хороший
SIGINT
(2) илиSIGTERM
(15) в ваш процесс. Вы также можете распечатать значение PID после запуска процесса:... или, что еще лучше, заставьте скрипт ждать a
SIGINT
и отправьте его обратно в фоновый процесс (это сохранит ваш скрипт на переднем плане) :Если
SIGINT
не достаточно, просто используйтеSIGTERM
вместо (15):Таким образом, когда ваш сценарий получает
SIGINT
( Ctrl+ C,kill -2
) илиSIGTERM
времяwait
для фонового процесса, он просто передает ему сигналы. Если эти сигналы уничтожатsfk
экземпляр, тоwait
вызов вернется, следовательно, и ваш скрипт завершится :)источник
jobs
в терминале после завершения скрипта (а неps
).pid -p
).wait
). Если убрать ожидание, то обработка сигнала нарушится: /