Solusi 1:
dalam istilah sederhana, tidak :suatu proses (misalnya daemon) dapat macet dan tidak memiliki waktu untuk menghapus file .pidnya.
Teknik untuk lebih memastikan keadaan program:gunakan saluran komunikasi eksplisit seperti soket. Tulis port soket dalam file dan miliki supervisor
proses mencarinya.
Anda juga dapat menggunakan layanan DBus di Linux:daftarkan nama tertentu dan minta proses penyelia Anda (apa pun namanya) untuk memeriksa nama tersebut.
Ada banyak teknik.
Satu hal yang perlu diingat:bukan tanggung jawab OS untuk mengelola file PID.
Solusi 2:
Jldupont benar dalam menyatakan bahwa file .pid tidak dapat diandalkan untuk menentukan apakah suatu proses berjalan karena file tidak dapat dihapus jika terjadi kerusakan.
Selain kondisi balapan, saya sering menggunakan pgrep ketika saya perlu tahu apakah suatu proses sedang berjalan. Saya kemudian dapat mereferensikan silang output dengan file .pid jika saya merasa perlu.
Solusi 3:
File yang berisi id proses tidak dapat diandalkan untuk menentukan apakah suatu proses sedang berjalan atau tidak. Itu hanya sumber yang dapat dipercaya, untuk mengetahui id proses yang terakhir diberikan untuk proses tersebut.
Ketika Anda memiliki id proses, Anda harus melakukan pemeriksaan lebih lanjut, apakah proses tersebut benar-benar berjalan.
Ini contohnya:
#!/usr/bin/env sh
file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)
if [ ! -f ${file} ]; then
echo "File does not exists: ${file}"
exit 1
fi
if [ ! -r ${file} ]; then
echo "Insufficient file persmissons: ${file}"
exit 1
fi
psoutput=$(ps -p ${processid} -o comm=)
if [ $? == 0 ];then
if [ ${psoutput} == "sshd" ]; then
echo "sshd process is realy running with process id ${processid}"
exit 0
else
echo "given process id ${processid} is not sshd: ${psoutput}"
exit 1
fi
else
echo "there is no process runing with process id ${processid}"
exit 0
fi
pgrep adalah perintah yang bagus, tetapi Anda akan mendapat masalah, saat Anda menjalankan banyak instance. Misalnya ketika Anda memiliki sshd reguler yang berjalan di port TCP/22 dan Anda memiliki sshd lain yang berjalan di port TCP/2222, maka pgrep akan mengirimkan dua id proses saat mencari sshd ... ketika sshd normal memiliki pid di /var/run/sshd.pid dan sshd lainnya dapat memiliki pid di /var/run/sshd-other.pid Anda dapat dengan jelas membedakan prosesnya.
Saya tidak sarankan untuk menggunakan ps saja , menyalurkan melalui satu atau beberapa pipa dengan grep dan grep -v mencoba memfilter semua hal lain yang tidak menarik bagi Anda... ini seperti menggunakan
find . | grep myfile
untuk mencari tahu, jika file keluar.
Solusi 4:
Tidak dapat diandalkan untuk sekadar memeriksa keberadaan proses dengan pid yang sama seperti yang terdapat dalam file.
Tetapi banyak implementasi pidfile juga melakukan penguncian pada pidfile, sehingga jika proses mati, kuncinya hilang. Asalkan mekanisme pengunciannya andal, memeriksa apakah file masih terkunci adalah mekanisme yang relatif andal untuk menentukan apakah proses aslinya masih berjalan.