Solusi apa pun yang menggunakan sesuatu seperti ps aux | grep abc
atau pgrep abc
cacat.
Mengapa?
Karena Anda tidak memeriksa apakah proses tertentu sedang berjalan, Anda memeriksa apakah ada proses yang berjalan yang cocok abc
. Setiap pengguna dapat dengan mudah membuat dan menjalankan nama yang dapat dieksekusi abc
(atau yang mengandung abc
suatu tempat dalam nama atau argumennya), menyebabkan hasil positif palsu untuk pengujian Anda. Ada berbagai opsi yang dapat Anda terapkan ps
, grep
dan pgrep
untuk mempersempit pencarian, tetapi Anda masih tidak akan mendapatkan tes yang andal.
Jadi, bagaimana cara saya andal menguji untuk proses berjalan tertentu?
Itu tergantung pada apa yang Anda butuhkan untuk tes.
Saya ingin memastikan bahwa layanan abc berjalan, dan jika tidak, mulai saja
Inilah tujuan init dan pemula. Mereka akan memulai layanan dan memastikan pidnya disimpan di pidfile. Cobalah untuk memulai layanan lagi (melalui init atau pemula) dan ia akan memeriksa pidfile, dan mulai jika tidak ada, atau batalkan jika sudah berjalan. Ini masih belum 100% andal, tapi sedekat yang Anda dapatkan.
Lihat Bagaimana saya dapat memeriksa untuk melihat apakah server permainan saya masih berjalan ... untuk solusi lain.
abc adalah skrip saya. Saya perlu memastikan hanya satu contoh skrip saya berjalan.
Dalam hal ini, gunakan file kunci atau file kunci. Misalnya
#!/usr/bin/env bash
if ! mkdir /tmp/abc.lock; then
printf "Failed to acquire lock.\n" >&2
exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT # remove the lockdir on exit
# rest of script ...
Lihat Bash FAQ 45 untuk cara mengunci lainnya.
zombie
proses '(Bukan apa yang saya gambarkan sebagai proses "berjalan"). Daftar lengkap apa yangSTAT
kolom nilai, dalam output darips
, menunjukkan di sini untuk mereka yang cenderung menulis jawaban yang mengakomodasi ini, atau mengedit sendiri.