Как вы, вероятно, можете сказать, есть много способов сделать это.
Что касается вашего «ОБНОВЛЕНИЯ № 2» - вообще говоря, завершение любого процесса в иерархии родитель-потомок, как правило, завершит все связанные процессы. Но есть много исключений из этого. В идеале вы хотите завершить последний «потомок» в дереве процессов, тогда родитель (ы) этого потомка должны выйти, если у них нет других задач для выполнения. Но если вы убиваете родителя, сигнал должен передаваться потомкам, когда родитель умирает, и потомки также должны выходить - но есть случаи, когда дочерние процессы могут игнорировать сигнал (через ловушки или подобные механизмы) и могут продолжаться выполнение будет наследоваться процессом 'init' (или подобным). Но этот предмет поведения процесса может стать сложным, и я просто оставлю его там ...
Один метод, который мне нравится, если я не хочу использовать скрипт управления (описан далее), - это использовать утилиту 'screen' для запуска и управления процессом. Команда «screen» полна функций и может занять некоторое время для освоения. Я бы посоветовал вам прочитать справочную страницу «screen» для полного объяснения. Быстрый пример запуска процесса в фоновом режиме - команда:
screen -d -m / path / to / program
Это запустит "/ path / to / program" внутри сеанса 'screen'.
Вы можете увидеть ваш сеанс бега с помощью команды:
скрин-ллы
И в любой момент вы можете подключиться к запущенной программе с помощью команды:
экран -r
А затем просто завершите его с помощью ^ C или чего-то еще.
Помимо красоты возможности повторного подключения и отключения от вашего процесса по желанию является то, что «screen» будет захватывать любой stdout (), который может создать ваша программа.
Но мое личное предпочтение в этих вопросах - иметь контрольную программу, которая управляет запуском и остановкой процесса. Это может быть несколько сложным и требует некоторых возможно сложных сценариев. И как любой сценарий, есть множество хороших способов сделать это. Я включил пример bash метода, который обычно использую для запуска и остановки приложений. Если ваша задача проста, вы можете вставить ее непосредственно в скрипт управления - или вы можете заставить этот скрипт управления вызывать другую внешнюю программу. Обратите внимание, что этот пример ни в коем случае не является исчерпывающим с точки зрения управления процессом. Я исключил возможность таких сценариев, как: проверка того, что сценарий еще не запущен, когда вы используете опцию «запуск», проверка того, что запущенный PID на самом деле является процессом, который вы запустили (например, ваш сценарий не ' t и другой процесс был запущен с использованием того же PID), и проверка того, что скрипт действительно ответил (вышел) на первый запрос kill. Выполнение всех этих проверок может быть сложным, и я не хотел делать пример слишком длинным и сложным. Возможно, вы захотите изменить пример, чтобы попрактиковаться в написании сценариев оболочки.
Сохраните следующий код в файл с именем «programctl», сделайте его исполняемым с помощью команды:
CHMOD 755 программ
Затем отредактируйте файл и добавьте ваш код / скрипт в case-раздел, который начинается с «myscript».
Когда все на месте, при условии, что «programctl» находится в текущем каталоге, вы можете запустить вашу программу с помощью:
./programctl начало
И остановите это с:
./programctl stop
Приветствия.
#!/bin/bash
# Description: A wrapper script used to stop/start another script.
#--------------------------------------
# Define Global Environment Settings:
#--------------------------------------
# Name and location of a persistent PID file
PIDFILE="/tmp/tmpfile-$LOGNAME.txt"
#--------------------------------------
# Check command line option and run...
# Note that "myscript" should not
# provided by the user.
#--------------------------------------
case $1
in
myscript)
# This is where your script would go.
# If this is a routine 'bash' shell script, you can enter
# the script below as illustrated in the example.
# Or you could simply provide the path and parameters
# to another script such as /dir/name/command -options
# Example of an embedded script:
while true
do
# do something over and over...
sleep 1
done
# Example of an external script:
/usr/local/bin/longrun -x
;;
start)
# Start your script in the background.
# (Note that this is a recursive call to the wrapper
# itself that effectively runs your script located above.)
$0 myscript &
# Save the backgound job process number into a file.
jobs -p > $PIDFILE
# Disconnect the job from this shell.
# (Note that 'disown' command is only in the 'bash' shell.)
disown %1
# Print a message indicating the script has been started
echo "Script has been started..."
;;
stop)
# Read the process number into the variable called PID
read PID < $PIDFILE
# Remove the PIDFILE
rm -f $PIDFILE
# Send a 'terminate' signal to process
kill $PID
# Print a message indicating the script has been stopped
echo "Script has been stopped..."
;;
*)
# Print a "usage" message in case no arguments are supplied
echo "Usage: $0 start | stop"
;;
esac