Muhtemelen söyleyebileceğiniz gibi bunu yapmanın birçok yolu vardır.
"GÜNCELLEME # 2" ile ilgili olarak - genel olarak konuşursak, bir üst-alt hiyerarşisindeki herhangi bir işlemi sonlandırmak genellikle ilişkili tüm işlemleri sonlandırır. Ancak bunun birçok istisnası var. İdeal olarak, bir işlem ağacındaki son 'alt' öğeyi sonlandırmak istersiniz, o zaman çalıştırılacak başka görevleri yoksa bu çocuğun ebeveyn (ler) inin çıkması gerekir. Ancak bir ebeveyni öldürürseniz, ebeveyn öldüğünde ve çocukların da çıkması gerektiğinde sinyal çocuklara iletilmelidir - ancak çocuk süreçlerinin sinyali görmezden gelebileceği (tuzaklar veya benzer mekanizmalar yoluyla) ve devam edebileceği durumlar vardır. çalıştırmak için 'init' süreci (veya benzeri) tarafından miras alınacaktır. Ama bu süreç davranışı konusu karmaşıklaşabilir ve ben sadece orada bırakacağım ...
Bir kontrol komut dosyası kullanmak istemiyorsam sevdiğim bir yöntem (daha sonra açıklanacaktır) işlemi başlatmak ve yönetmek için 'ekran' yardımcı programını kullanmaktır. 'Ekran' komutu özelliklerle doludur ve ustalaşması biraz zaman alabilir. Tam bir açıklama için 'ekran' kılavuz sayfasını okumanızı tavsiye ederim. Arka planda bir işlemi başlatmak için hızlı bir örnek komut olacaktır:
ekran -d -m / yol / program / program
Bu, bir 'ekran' oturumunun içinde "/ path / to / program" başlayacaktır.
Koşu oturumunuzu şu komutla görebilirsiniz:
ekran -ls
Ve istediğiniz zaman şu komutla çalışan programınıza yeniden bağlanabilirsiniz:
ekran -r
Ve sonra sadece ^ C veya başka bir şeyle sonlandırın.
İhtiyacınız olan süreçte yeniden bağlantı kurabilme ve bağlantıyı kesebilmenin güzelliğinin yanı sıra 'ekran', programınızın üretebileceği herhangi bir stdout'u () yakalayacaktır.
Ancak bu konulardaki kişisel tercihim, bir sürecin başlatılmasını ve durdurulmasını yöneten bir kontrol programına sahip olmaktır. Bu biraz karmaşık olabilir ve tartışmasız karmaşık bir komut dosyası gerektirir. Ve herhangi bir senaryo gibi, bunu yapmanın onlarca iyi yolu var. Uygulamaları başlatmak ve durdurmak için rutin olarak kullandığım bir yöntemin bash örneğini ekledim. Göreviniz basitse, doğrudan kontrol komut dosyasına ekleyebilirsiniz - veya bu kontrol komut dosyasının başka bir harici programı çağırmasını sağlayabilirsiniz. Bu örneğin hiçbir şekilde süreci yönetme açısından kapsamlı olmadığını unutmayın. Gibi senaryoların olasılığını dışarıda bıraktım: "start" seçeneğini kullandığınızda betiğin zaten çalışmadığından emin olmak, çalışan PID'nin aslında başlattığınız işlem olduğunu doğrulamak (örn. t öldü ve aynı PID kullanılarak başka bir işlem başlatıldı) ve betiğin ilk 'öldürme' isteğinde gerçekten yanıt verdiğini (çıktığını) doğruladı. Tüm bu kontrolleri yapmak karmaşıklaşabilir ve örneği çok uzun ve karmaşık yapmak istemedim. Kabuk komut dosyalarınızı uygulamak için örneği değiştirmek isteyebilirsiniz.
Aşağıdaki kodu "programctl" adlı bir dosyaya kaydedin, komutla yürütülebilir yapın:
chmod 755 program programı
Ardından dosyayı düzenleyin ve kodunuzu / komut dosyanızı "myscript" ile başlayan vaka bölümüne ekleyin.
Her şey hazır olduğunda, "programctl" ifadesinin geçerli dizinde olduğu varsayılarak, programınızı aşağıdakilerle başlatabilirsiniz:
./programctl başlangıç
Ve şununla durdur:
./programctl durdurma
Şerefe.
#!/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