Як ви, напевно, можете сказати, існує маса способів зробити це.
Щодо вашого "ОНОВЛЕННЯ №2" - загалом кажучи, припинення будь-якого процесу в ієрархії батько-дитина, як правило, припиняє всі пов'язані з цим процеси. Але є багато винятків із цього. В ідеалі, ви хочете припинити остаточне "дочірнє" у дереві процесів, тоді батьки цієї дитини повинні вийти, якщо у них немає інших завдань для запуску. Але якщо ви вбите батьків, сигнал повинен бути переданий дітям, коли батько помирає, і діти також повинні вийти - але є випадки, коли діти-процеси можуть ігнорувати сигнал (через пастки або подібні механізми) і можуть тривати для запуску заповіту буде успадкований процес 'init' (або подібний.) Але цей предмет поведінки процесу може стати складним, і я просто залишу його там ...
Один із способів, який мені подобається, якщо я не хочу використовувати контрольний скрипт (описаний далі), - це використовувати утиліту 'screen' для запуску та управління процесом. Команда 'screen' має багато функцій і може зайняти деякий час, щоб освоїти Я б закликав вас прочитати головну сторінку "екрана" для повного пояснення. Швидкий приклад запустити процес у фоновому режимі - це команда:
екран -d -m / шлях / до / програма
Це розпочнеться "/ шлях / до / програми" всередині сеансу "екран".
Ви можете побачити свій запущений сеанс за допомогою команди:
екран -л
І в будь-який час ви можете підключитися до запущеної програми за допомогою команди:
екран -r
А потім просто припиніть його з ^ С або чим завгодно.
Окрім краси того, що можна за власним бажанням знову підключитися та відключитися від процесу, це те, що на екрані буде відображено будь-який stdout (), який може створити ваша програма.
Але мої особисті переваги в цих питаннях - мати контрольну програму, яка керує запуском і зупинкою процесу. Це може стати дещо складним і вимагає певних складних сценаріїв. І як і будь-який сценарій, є десятки хороших способів зробити це. Я включив базовий приклад методу, який я звичайно використовую для запуску та зупинки програм. Якщо ваше завдання просте, ви можете вставити його безпосередньо в керуючий скрипт - або ви можете закликати цей скрипт управління викликати іншу зовнішню програму. Зауважте, що цей приклад аж ніяк не є комплексним з точки зору управління процесом. Я покинув можливість таких сценаріїв, як: Переконайтесь, що сценарій вже не працює, коли ви використовуєте опцію "start", перевіряючи, що запущений PID - це фактично процес, який ви розпочали (наприклад, ваш скрипт hasn ' t помер, і інший процес був запущений з використанням того ж PID), і підтверджуючи, що сценарій насправді відповів (вийшов) на перший запит 'kill'. Виконання всіх цих перевірок може ускладнитися, і я не хотів робити приклад занадто довгим і складним. Можливо, ви захочете змінити приклад, щоб практикувати сценарій оболонки.
Збережіть наступний код у файлі під назвою "programctl", зробіть його виконуваним за допомогою команди:
chmod 755 programctl
Потім відредагуйте файл та додайте свій код / скрипт у розділ справи, який починається з «myscript».
Як тільки все буде на місці, якщо припустити, що "programctl" знаходиться в поточному каталозі, ви можете запустити свою програму з:
./programctl start
І зупиніть це:
./programctl зупинка
Ура.
#!/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