Rumah >pembangunan bahagian belakang >Golang >Analisis cara Golang mencipta proses daemon dan dimulakan semula dengan lancar

Analisis cara Golang mencipta proses daemon dan dimulakan semula dengan lancar

藏色散人
藏色散人ke hadapan
2021-07-23 14:25:472660semak imbas

Sebagai veteran pembangunan PHP. Menggunakan baris arahan untuk memulakan/memulakan/menghentikan operasi seperti nginx dan PHP-FPM. Sangat kagum. Jika saya diminta untuk membangunkan sistem sedemikian menggunakan C/C, saya pasti tidak mempunyai tenaga untuk melakukannya. Namun, sejak Golang memasuki bidang penglihatan saya. Saya dapati semuanya sangat mudah.

1) Hasilkan proses daemon

Pergi terus ke kod:

package main

import (
    "os"
    "os/exec"
    "path/filepath"
)

func main() {
    //判 断当其是否是子进程,当父进程return之后,子进程会被 系统1 号进程接管
    if os.Getppid() != 1 {
        // 将命令行参数中执行文件路径转换成可用路径
        filePath, _ := filepath.Abs(os.Args[0])
        cmd := exec.Command(filePath, os.Args[1:]...)
        // 将其他命令传入生成出的进程
        cmd.Stdin = os.Stdin // 给新进程设置文件描述符,可以重定向到文件中
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr
        cmd.Start() // 开始执行新进程,不等待新进程退出
        return
    }
}

Orang yang biasa dengan sistem Linux harus tahu: proses daemon yang dibuat oleh pengguna akan digunakan oleh sistem Linux 1 Nombor proses mengambil alih. Dalam erti kata lain, kod di atas hanya boleh dijalankan pada sistem Linux. Saya tidak pernah bermain dengan sistem Unix. Oleh itu, saya tidak boleh memberikan cadangan khusus.

Saya melihat di Internet bahawa terdapat cara lain untuk mencipta daemon. Walau bagaimanapun, saya fikir hanya kaedah kod sumber di atas kelihatan baik kepada saya. dan berjaya digunakan dalam projek.

Contohnya:

os.StartProcess() 创建守护进程。
syscall.RawSyscall() 创建守护进程。

Hanya exec.Command ialah cara paling maju untuk mencipta daemon. Terkapsul terbaik. Adalah disyorkan untuk menggunakan ujian ini.

2) Daemon mula/mulakan/berhenti

Dalam titik 1, kami telah berjaya memulakan daemon. Walau bagaimanapun, kami tidak boleh menggunakan perintah bunuh untuk menamatkannya. Kemudian, mulakan semula. Oleh itu, kita perlu menggunakan pendekatan profesional industri: isyarat.

Sebarang proses yang berjalan boleh menerima isyarat yang kami hantar kepadanya. Terdapat banyak isyarat tentang Linux. Anda boleh mencari di Google untuk kata kunci: Linux signal.

Pergi terus ke kod sumber:

package main

import "fmt"
import "os"
import "os/signal"
import "syscall"

func main() {

    // Go signal notification works by sending `os.Signal`
    // values on a channel. We'll create a channel to
    // receive these notifications (we'll also make one to
    // notify us when the program can exit).
    sigs := make(chan os.Signal, 1)
    done := make(chan bool, 1)

    // `signal.Notify` registers the given channel to
    // receive notifications of the specified signals.
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    // This goroutine executes a blocking receive for
    // signals. When it gets one it'll print it out
    // and then notify the program that it can finish.
    go func() {
        sig := <-sigs
        fmt.Println()
        fmt.Println(sig)
        done <- true
    }()

    // The program will wait here until it gets the
    // expected signal (as indicated by the goroutine
    // above sending a value on `done`) and then exit.
    fmt.Println("awaiting signal")
    <-done
    fmt.Println("exiting")
}

Terdapat tiga perkara utama:
1) Daftar isyarat
2) Terima isyarat
3) Isyarat proses.

Selagi penciptaan proses daemon dan pemprosesan semaphore disepadukan, arahan boleh dilaksanakan untuk mengurus proses daemon.

Untuk lebih banyak artikel teknikal berkaitan golang, sila lawati ruangan tutorial golang!

Atas ialah kandungan terperinci Analisis cara Golang mencipta proses daemon dan dimulakan semula dengan lancar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:jianshu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam