Apakah file .pid dapat diandalkan untuk menentukan apakah suatu proses sedang berjalan?

11

Banyak program seperti sshd membuat file .pid di / var / run / yang berisi ID prosesnya. Apakah file-file ini dapat diandalkan untuk menentukan apakah suatu proses sedang berjalan? Dugaan saya adalah bahwa file-file ini dibuat secara manual oleh suatu proses, dan karena itu akan tetap berada di sistem file jika program macet.

indiv
sumber

Jawaban:

16

dalam istilah sederhana, tidak : proses (mis. daemon) dapat macet dan tidak punya waktu untuk menghapus file .pid-nya.

Suatu teknik untuk lebih yakin tentang keadaan suatu program: gunakan saluran komunikasi eksplisit seperti soket. Tulis port soket dalam file dan minta supervisorproses mencarinya.

Anda juga dapat menggunakan layanan DBus di Linux: daftarkan nama tertentu dan minta proses penyelia Anda (apa pun namanya) memeriksa nama itu.

Ada banyak teknik.

Satu hal yang perlu diingat: itu bukan tanggung jawab OS untuk mengelola file PID.

jldupont
sumber
1
Keberadaan file pid, GABUNGAN dengan keberadaan proses Namun, harus memadai. Jika proses berhenti, Anda dapat memeriksanya. PID dapat digunakan kembali, tetapi tidak terlalu sering.
MarkR
2
seberapa sering pid digunakan kembali tergantung pada sistem tertentu yang bersangkutan. Saya telah melihat sebuah sistem PID yang didaur ulang setidaknya setiap hari. Anda harus memeriksa pid, bahwa ada proses, dan bahwa proses tersebut tampaknya adalah yang Anda harapkan untuk memiliki pid.
@ atk: persis. Tidak ada standar per-se dan bahkan jika ada, itu bisa sangat tidak dihormati oleh beberapa implementasi. Misalnya saya dapat membuat daemon yang tidak menulis file PID sama sekali dan menggunakan saluran belakang untuk mendapatkan perintah manajemennya.
jldupont
@ atk: sayangnya, tidak ada cara untuk memastikan bahwa PID tidak dapat digunakan kembali antara waktu pemeriksaan dan waktu penggunaan ...
SamB
3

Jldupont benar dalam menyatakan bahwa file .pid tidak dapat diandalkan untuk menentukan apakah suatu proses sedang berjalan karena file tersebut mungkin tidak dihapus jika terjadi kerusakan.

Selain kondisi ras, saya sering menggunakan pgrep ketika saya perlu tahu apakah suatu proses sedang berjalan. Saya kemudian bisa referensi silang output terhadap file .pid jika saya merasa perlu.

Jschmier
sumber
3

File yang berisi id proses tidak dapat diandalkan menentukan apakah suatu proses sedang berjalan atau tidak. Ini hanya sumber yang dapat diandalkan, untuk mengetahui id proses yang diberikan terakhir untuk proses tersebut.

Ketika Anda memiliki id proses, Anda harus melakukan pemeriksaan lebih lanjut, jika prosesnya benar-benar berjalan.

Berikut ini sebuah contoh:

#!/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. Sebagai contoh ketika Anda memiliki sshd reguler yang berjalan pada port TCP / 22 dan Anda memiliki sshd lain yang berjalan pada port TCP / 2222, maka pgrep akan memberikan dua id proses ketika mencari sshd ... ketika sshd normal memiliki pid di / var /run/sshd.pid dan yang lain dapat memiliki pid di /var/run/sshd-other.pid Anda dapat dengan jelas membedakan prosesnya.

Saya tidak merekomendasikan hanya menggunakan ps , memipis melalui satu atau beberapa pipa dengan grep dan grep -v mencoba untuk menyaring semua hal lain yang tidak menarik bagi Anda ... ini seperti menggunakan

find . | grep myfile

untuk mencari tahu, jika file keluar.

Mirko Steiner
sumber
2

Tidak dapat diandalkan hanya memeriksa keberadaan suatu proses dengan pid yang sama seperti yang terkandung dalam file.

Tetapi banyak implementasi pidfile juga melakukan penguncian pada pidfile, sehingga jika prosesnya mati, kuncinya hilang. Asalkan mekanisme penguncian dapat diandalkan, memeriksa untuk melihat apakah file masih terkunci adalah mekanisme yang relatif dapat diandalkan untuk menentukan apakah proses asli masih berjalan.

Paul Brannan
sumber
1

Jldupont benar.

Anda dapat, bagaimanapun, mengirim proses sinyal 0 (kill -s 0 pid) untuk melihat apakah proses tersebut masih hidup (dengan asumsi Anda memiliki otoritas untuk mengirim sinyal seperti itu - secara umum, hanya pemilik proses yang dapat mengirim itu sinyal).


sumber
4
Tetapi memeriksa keberadaan proses dengan PID itu tidak berarti bahwa itu adalah PID yang Anda minati.
Januari
0

Saya setuju dengan jschmier.

Pada beberapa sistem, Anda tidak mendapatkan akses ke pgrep. Dalam kasus seperti itu, Anda dapat melakukannya ps -aef | grep <pid>untuk mengetahui apakah prosesnya benar-benar berjalan.

pengguna29584
sumber
1
Poin kunci dalam pertanyaan itu adalah "dapat diandalkan". Melakukan ps dan mencari PID tidak dapat diandalkan.
janm
yah ... dengan anggapan Anda tahu nama program itu, mengapa Anda berpikir ps -aef | grep tidak bisa diandalkan?
user29584
3
Kondisi lomba: keadaan sistem telah berubah pada saat ps selesai. Judul proses: proses lain dapat memiliki judul yang mirip dengan judul yang Anda minati. Banyak contoh: Pertimbangkan sistem dengan dua contoh layanan yang sama, masing-masing dengan file PID. Satu gagal, dan yang lainnya restart dan mendapatkan PID dari layanan pertama. Bagaimana anda tahu Dll. Tidak dapat diandalkan, tidak mungkin untuk mendapatkan yang benar karena kondisi balapan, dan ada teknik yang dapat diandalkan yang hanya bekerja. Untuk alternatif yang andal, lihat, misalnya, cr.yp.to/daemontools.html
janm