Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memeriksa Kewujudan Proses dengan Amanah dalam Go Beyond os.FindProcess?

Bagaimana untuk Memeriksa Kewujudan Proses dengan Amanah dalam Go Beyond os.FindProcess?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-07 12:32:03894semak imbas

How to Reliably Check for Process Existence in Go Beyond os.FindProcess?

Cara Mengesahkan Kewujudan Proses dalam Go Tanpa Bergantung Semata-mata pada os.FindProcess

Apabila berurusan dengan proses dalam Go, perkara biasa kecenderungan adalah untuk menggunakan os.FindProcess untuk menentukan sama ada proses dengan PID tertentu wujud. Walau bagaimanapun, hanya bergantung pada kaedah ini boleh membawa kepada kesimpulan yang tidak tepat.

Keterbatasan os.FindProcess

os.FindProcess dengan berkesan menanyakan sistem pengendalian untuk mendapatkan maklumat tentang sesuatu proses . Jika proses dengan PID yang ditentukan wujud, ia mengembalikan hasil bukan ralat. Walau bagaimanapun, jika proses telah ditamatkan, os.FindProcess masih boleh melaporkan kejayaan jika sistem pengendalian belum lagi menuai proses (iaitu, mengalih keluar masuknya daripada jadual proses sistem). Ini boleh membawa kepada positif palsu, menunjukkan bahawa proses masih berjalan apabila ia telah benar-benar selesai.

Meneroka Penyelesaian Alternatif: Menghantar Isyarat

Untuk menyemak dengan pasti kewujudan proses, kita boleh menggunakan pendekatan Unix tradisional untuk menghantar isyarat 0 (sifar) kepada proses sasaran. Teknik ini berfungsi kerana:

  • Jika proses masih hidup, menghantar isyarat 0 akan berjaya tanpa menyebabkan sebarang kesan buruk.
  • Jika proses telah ditamatkan, menghantar isyarat 0 akan gagal dengan mesej ralat "tiada proses sedemikian."

Melaksanakan Penyelesaian Berasaskan Isyarat dalam Go

Berikut ialah contoh fungsi Go yang menggunakan ini pendekatan:

package main

import (
    "fmt"
    "log"
    "os"
    "os/signal"
    "strconv"
)

// checkProcessExistence sends a signal of 0 to a process to determine its existence.
func checkProcessExistence(pid int) bool {
    process, err := os.FindProcess(pid)
    if err != nil {
        log.Fatal(err)
    }

    err = process.Signal(signal.Signal(0))
    if err != nil {
        return false
    }

    return true
}

func main() {
    for _, p := range os.Args[1:] {
        pid, err := strconv.ParseInt(p, 10, 64)
        if err != nil {
            log.Fatal(err)
        }

        if checkProcessExistence(int(pid)) {
            fmt.Printf("Process with PID %d is running\n", pid)
        } else {
            fmt.Printf("Process with PID %d is not running\n", pid)
        }
    }
}

Contoh Penggunaan

Andaikan anda mempunyai PID proses A dan anda ingin mengesahkan sama ada ia masih berjalan:

$ go run main.go 12345
Process with PID 12345 is running

Output ini mengesahkan bahawa proses 12345 sememangnya hidup.

Atas ialah kandungan terperinci Bagaimana untuk Memeriksa Kewujudan Proses dengan Amanah dalam Go Beyond os.FindProcess?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn