Seperti yang Anda mungkin tahu ada banyak cara untuk melakukan ini.
Mengenai "PEMBARUAN # 2" Anda - secara umum, menghentikan proses apa pun dalam hierarki orang tua-anak umumnya akan menghentikan semua proses yang terkait. Tetapi ada banyak pengecualian untuk ini. Idealnya, Anda ingin mengakhiri 'anak' terakhir di pohon proses, maka orang tua dari anak ini harus keluar jika mereka tidak memiliki tugas lain untuk dijalankan. Tetapi jika Anda membunuh orang tua, sinyal harus diteruskan ke anak-anak ketika orang tua meninggal dan anak-anak harus keluar juga - tetapi ada kasus di mana proses anak-anak dapat mengabaikan sinyal (melalui perangkap atau mekanisme serupa) dan dapat melanjutkan untuk menjalankan akan diwarisi oleh proses 'init' (atau serupa.) Tapi subjek perilaku proses ini bisa menjadi kompleks dan saya hanya akan membiarkannya di sana ...
Salah satu metode yang saya suka jika saya tidak ingin menggunakan skrip kontrol (dijelaskan selanjutnya) adalah dengan menggunakan utilitas 'layar' untuk memulai dan mengelola proses. Perintah 'layar' penuh dengan fitur dan dapat membutuhkan waktu untuk dikuasai. Saya mendorong Anda untuk membaca halaman manual 'layar' untuk penjelasan lengkap. Contoh cepat untuk memulai proses di latar belakang adalah perintah:
layar -d -m / path / ke / program
Ini akan memulai "/ path / ke / program" di dalam sesi 'layar'.
Anda dapat melihat sesi lari Anda dengan perintah:
layar -l
Dan kapan saja Anda dapat menyambung kembali ke program Anda yang sedang berjalan dengan perintah:
layar -r
Dan kemudian akhiri saja dengan ^ C atau apa pun.
Selain keindahan dari dapat terhubung kembali dan terputus dari proses Anda sesuka hati adalah 'layar' akan menangkap stdout () apa pun yang mungkin dihasilkan oleh program Anda.
Tetapi preferensi pribadi saya dalam masalah ini adalah memiliki program kontrol yang mengelola awal dan penghentian suatu proses. Ini bisa menjadi agak rumit dan memerlukan beberapa skrip yang bisa dibilang rumit. Dan seperti naskah apa pun, ada lusinan cara bagus untuk melakukannya. Saya telah memasukkan contoh bash dari metode yang saya gunakan secara rutin untuk memulai dan menghentikan aplikasi. Jika tugas Anda sederhana, Anda dapat memasukkannya langsung ke skrip kontrol - atau skrip kontrol ini memanggil program eksternal lain. Perhatikan bahwa contoh ini sama sekali tidak komprehensif dalam hal mengelola proses. Saya telah menghilangkan kemungkinan skenario seperti: Memastikan skrip belum berjalan ketika Anda menggunakan opsi "mulai", memvalidasi bahwa PID yang sedang berjalan sebenarnya adalah proses yang Anda mulai (mis. Skrip Anda belum t mati dan proses lain telah dimulai menggunakan PID yang sama), dan memvalidasi bahwa skrip benar-benar merespons (keluar) pada permintaan 'bunuh' pertama. Melakukan semua pemeriksaan ini dapat menjadi rumit dan saya tidak ingin membuat contoh terlalu panjang dan rumit. Anda mungkin ingin memodifikasi contoh untuk mempraktikkan skrip shell Anda.
Simpan kode berikut ke file yang disebut "programctl", membuatnya dapat dieksekusi dengan perintah:
chmod 755 programctl
Kemudian edit file dan tambahkan kode / skrip Anda di bagian case yang dimulai dengan "myscript".
Setelah semuanya ada, dengan asumsi "programctl" ada di direktori saat ini, Anda dapat memulai program Anda dengan:
./programctl mulai
Dan hentikan dengan:
./programctl berhenti
Bersulang.
#!/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