Saya ingin menjalankan dan mengonfigurasi proses yang mirip dengan daemon dari skrip.
Shell saya ditiru zsh di bawah Cygwin dan daemonnya adalah SFK , server FTP dasar.
Untuk yang penting di sini, skrip startserv.sh
dapat disusun sebagai berikut:
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &
Setelah menjalankan skrip startserv.sh
, berhenti (berakhir?) Tanpa menampilkan prompt, lalu:
CTRL+ Cmengakhiri skrip dan proses pekerjaan latar belakang;
Memukul Enterscript berakhir proses tetap di latar belakang.
Pokoknya saya bisa melihatnya hanya melalui ps
dan tidak jobs
, jadi, ketika saya ingin menutup proses, saya harus mengirim kill -9
sinyal brutal , yang merupakan sesuatu yang saya ingin hindari mendukung CTRL+ C.
Alternatif akan menjalankan seluruh skrip di latar belakang. 'Would be', tetapi read
perintah tidak dapat mendapatkan input pengguna jika skrip dijalankan sebagai startserv.sh &
.
Perhatikan bahwa saya memerlukan server singkat, bukan daemon sejati : yaitu, saya ingin proses server berjalan di latar belakang, setelah skrip berakhir, untuk melakukan tugas shell interaktif sederhana (dengan tamu mesin virtual), tetapi saya tidak t perlu proses untuk bertahan dari cangkang; oleh karena itu nohup
sepertinya tidak tepat.
bgproc="$!"
dan kemudiancommand "$bgproc"
untuk mengambil tindakan yang sesuai. Lihat juga stackoverflow.com/questions/1908610/...Jawaban:
Hampir! Sebenarnya, skrip sudah keluar pada saat Anda menekan Enter. Namun, begitulah cara Anda mendapatkan balasan kembali (karena shell Anda mencetak
$PS1
semuanya lagi).Alasan mengapa memukul Ctrl+ Cmengakhiri keduanya adalah karena keduanya terhubung. Saat Anda menjalankan skrip Anda, shell Anda memulai subkulit untuk menjalankannya. Ketika Anda mengakhiri subkulit ini, proses latar belakang Anda mati, mungkin dari
SIGHUP
sinyal.Pisahkan skrip, proses latar belakang dan subkulit
Dengan menggunakan
nohup
, Anda mungkin bisa menghilangkan sedikit ketidaknyamanan ini.The
disown
alternatifJika Anda dapat beralih dari
/bin/sh
ke/bin/bash
, Anda dapat mencobadisown
juga. Untuk tahu lebih banyak, cukup ketikkanhelp disown
sebuahbash
instance.Membunuh proses latar belakang "dengan baik"
Sekarang, ketika datang untuk membunuh proses Anda, Anda dapat dengan sempurna melakukan " Ctrl+ C" menggunakan
kill
. Hanya saja, jangan mengirim brutalSIGKILL
. Sebagai gantinya, Anda dapat menggunakan:Yang akan mengirim barang bagus
SIGINT
(2) atauSIGTERM
(15) ke proses Anda. Anda mungkin juga ingin mencetak nilai PID setelah memulai proses:... atau bahkan lebih baik, buat skrip menunggu
SIGINT
, dan kirim kembali ke proses latar belakang (ini akan membuat skrip Anda tetap di latar depan) :Jika a
SIGINT
tidak cukup, gunakanSIGTERM
saja (15):Dengan cara ini, ketika skrip Anda menerima
SIGINT
( Ctrl+ C,kill -2
) atauSIGTERM
sebentarwait
untuk proses latar belakang, itu hanya akan menyampaikan sinyal ke sana. Jika sinyal-sinyal ini benar-benar membunuhsfk
instance, makawait
panggilan akan kembali, karena itu akhiri skrip Anda juga :)sumber
jobs
di terminal setelah skrip berakhir (bukanps
).pid -p
).wait
). Jika Anda menghapus menunggu, maka penanganan sinyal rusak: /