GNU/Linux >> Belajar Linux >  >> Linux

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

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.


Linux
  1. File Pseudo Untuk Data Sementara?

  2. Proses Yang Memiliki Pid 0?

  3. Pustaka Python untuk manajemen proses Linux

  1. Bagaimana cara memeriksa pustaka bersama apa yang dimuat saat dijalankan untuk proses tertentu?

  2. Tentukan di grup mana proses berjalan berada?

  3. Cara menemukan file .pid untuk proses tertentu

  1. Ubah Lingkungan Proses yang Berjalan?

  2. Pengaturan Di Bash Untuk Globbing, Untuk Mengontrol Apakah * Cocok dengan File Dot?

  3. Periksa Proses Jika Sama Sedang Berjalan?