Jak zapewne można stwierdzić, istnieje wiele sposobów na zrobienie tego.
Jeśli chodzi o twoją „AKTUALIZACJĘ # 2” - ogólnie mówiąc, zakończenie dowolnego procesu w hierarchii rodzic-dziecko spowoduje na ogół zakończenie wszystkich powiązanych procesów. Ale istnieje wiele wyjątków od tego. Najlepiej, jeśli chcesz zakończyć ostatnie „dziecko” w drzewie procesów, a następnie rodzice (rodzice) tego dziecka powinni wyjść, jeśli nie mają innych zadań do uruchomienia. Ale jeśli zabijesz rodzica, sygnał powinien zostać przekazany dzieciom, gdy rodzic umiera, a dzieci powinny również wyjść - ale są przypadki, w których procesy potomne mogą zignorować sygnał (za pośrednictwem pułapek lub podobnych mechanizmów) i mogą kontynuować uruchomienie zostanie odziedziczone przez proces „init” (lub podobny). Ale ten temat zachowania procesu może się skomplikować i po prostu zostawię go tam ...
Jedną z metod, które lubię, jeśli nie chcę używać skryptu sterującego (opisanego poniżej), jest użycie narzędzia „screen” do uruchomienia i zarządzania procesem. Komenda „screen” jest pełna funkcji i opanowanie jej może trochę potrwać. Zachęcam do przeczytania strony podręcznika „screen”, aby uzyskać pełne wyjaśnienie. Szybki przykład uruchomienia procesu w tle to polecenie:
screen -d -m / ścieżka / do / program
To rozpocznie „/ path / to / program” w sesji „screen”.
Możesz zobaczyć swoją uruchomioną sesję za pomocą polecenia:
screen -ls
W każdej chwili możesz ponownie połączyć się z uruchomionym programem za pomocą polecenia:
screen -r
A następnie po prostu zakończ go ^ C lub czymkolwiek.
Oprócz piękna, jakim jest możliwość ponownego połączenia i rozłączenia się z procesem do woli, „ekran” przechwytuje wszystkie standardowe () stdout (), które może wytworzyć Twój program.
Ale moje osobiste preferencje w tych sprawach to mieć program kontrolny, który zarządza uruchamianiem i zatrzymywaniem procesu. Może to być nieco skomplikowane i wymaga pewnie skomplikowanych skryptów. I jak każdy skrypt, istnieją dziesiątki dobrych sposobów na zrobienie tego. Podałem przykładowy przykład metody, której rutynowo używam do uruchamiania i zatrzymywania aplikacji. Jeśli twoje zadanie jest proste, możesz wstawić je bezpośrednio do skryptu sterującego - lub możesz wywoływać ten skrypt sterujący w innym programie zewnętrznym. Należy zauważyć, że ten przykład nie jest kompleksowy pod względem zarządzania procesem. Pominąłem możliwość takich scenariuszy, jak: upewnienie się, że skrypt nie jest już uruchomiony, gdy korzystasz z opcji „start”, sprawdzanie, czy działający PID jest tak naprawdę procesem, który rozpocząłeś (np. Twój skrypt nie „ t zmarł, a inny proces został uruchomiony przy użyciu tego samego PID) i sprawdzanie, czy skrypt faktycznie odpowiedział (zakończył) na pierwsze żądanie „zabicia”. Wykonanie wszystkich tych kontroli może się skomplikować i nie chciałem, aby przykład był zbyt długi i skomplikowany. Możesz zmodyfikować przykład, aby ćwiczyć skrypty powłoki.
Zapisz następujący kod w pliku o nazwie „programctl”, aby był wykonywalny za pomocą polecenia:
chmod 755 programctl
Następnie edytuj plik i dodaj swój kod / skrypt w sekcji przypadku zaczynającej się od „myscript”.
Gdy wszystko będzie już na swoim miejscu, zakładając, że „programctl” znajduje się w bieżącym katalogu, możesz uruchomić swój program za pomocą:
./programctl start
I przestań:
./programctl stop
Twoje zdrowie.
#!/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