Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Proses golang hilang dengan sendirinya

Proses golang hilang dengan sendirinya

PHPz
PHPzasal
2023-05-10 10:14:06799semak imbas

Baru-baru ini, saya menghadapi masalah yang sangat pelik dalam program yang ditulis dalam Golang, iaitu proses itu hilang dengan sendirinya. Selepas beberapa penyelesaian masalah, saya menemui masalah itu dan merumuskan beberapa pengalaman. Izinkan saya berkongsi masalah dan penyelesaian yang saya hadapi di bawah.

Perihalan Masalah

Produk kami melaksanakan tugas dengan kerap setiap hari Dalam beberapa hari yang lalu, saya mendapati bahawa tugasan itu sentiasa berhenti selepas beberapa minit saya menetapkan output log. ke fail, dan kemudian melihat log dan mendapati bahawa proses itu hanya berjalan selama beberapa minit dan kemudian hilang dengan sendirinya. Keadaan ini sangat pelik, kerana saya tidak pernah menghadapi masalah yang sama dalam pembangunan dan ujian biasa.

Proses penyelesaian masalah

Pertama sekali, saya memikirkan penyelesaian paling mudah: tambahkan maklumat nyahpepijat pada kod. Jadi, apabila saya memulakan proses, saya mengeluarkan log start, dan kemudian setiap kali saya melakukan beberapa operasi penting, saya mengeluarkan log yang sepadan. Kemudian, saya memulakan semula tugas itu, menunggu ia berhenti, dan kemudian menyemak log dan mendapati bahawa proses itu berhenti hanya beberapa minit selepas ia dimulakan, tetapi ia tidak mengeluarkan sebarang mesej ralat dalam log Nampaknya ia ditamatkan sendiri.

Seterusnya, saya cuba menggunakan perintah strace untuk mengesan panggilan sistem proses untuk melihat sebab ia ditamatkan. Walau bagaimanapun, struktur proses ini agak kompleks, dengan berbilang goroutine berjalan. Saya menggunakan perintah strace untuk mengesan salah satu goroutine (menghantar) untuk melihat panggilan sistemnya. Berikut ialah kod ndeliver goroutine yang berkaitan:

c := make(chan os.Signal, 1)

signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)

go func() {
    sig := <-c
    log.Errorf("main: received signal %s, shutting down server", sig.String())
    server.Stop()
    os.Exit(0)
}()

go func() {
    err := server.Start()
    if err != nil {
        log.Fatalf("ndeliver: server start error: %s", err)
    }
}()

Fungsi kod ini adalah untuk mendaftarkan fungsi pemprosesan isyarat untuk proses dan memulakan goroutine untuk melaksanakan fungsi server.Start(), yang akan menyekat sehingga proses keluar.

Melalui perintah strace, saya mendapati bahawa goroutine ini tidak mempunyai sebarang pengecualian, dan ia keluar tanpa menghadapi sebarang ralat. Walau bagaimanapun, saya mendapati terdapat goroutine lain dalam proses itu keseluruhan proses Ia runtuh. strace

Penyelesaian

Dengan melihat kod, saya mendapati panik ini disebabkan oleh fail yang dipadamkan, tetapi kod kami tidak mengendalikan ralat ini. Apabila panik goroutine tidak dikendalikan, keseluruhan proses akan ranap, itulah sebabnya proses itu hilang dengan sendirinya.

Untuk menyelesaikan masalah ini, kita perlu mengendalikan panik untuk mengelakkannya daripada ranap keseluruhan proses. Kita boleh menggunakan fungsi pulih jika perlu untuk menangkap panik dan kemudian mengendalikannya untuk mengelakkan ranap proses.

Berikut ialah contoh kod untuk mengendalikan panik:

defer func() {
    if r := recover(); r != nil {
        log.Errorf("goroutine panic: %v", r)
        // TODO: 处理 panic
    }
}()

// 代码片段

Dengan menggunakan fungsi defer, apabila goroutine tamat, walaupun panik, kita boleh menangkapnya dan mengendalikannya dengan sewajarnya, di sini Kami hanya mengeluarkan maklumat panik, tetapi sebenarnya, kami juga boleh melakukan pemprosesan lain di sini, seperti menghantar amaran atau mengelog lebih banyak maklumat tentang ralat.

Ringkasan

Apabila menulis kod Golang, disebabkan sifat istimewa goroutine, apabila goroutine panik, ia boleh menyebabkan keseluruhan proses ranap. Oleh itu, semasa menulis kod, kita mesti mengambil kira situasi ini dan menulis kod untuk mengendalikan situasi ini. Adalah sangat penting untuk menambah pengendalian panik dalam kod, ia boleh membantu kami mengelakkan daripada menghadapi masalah yang sama dalam persekitaran pengeluaran.

Atas ialah kandungan terperinci Proses golang hilang dengan sendirinya. 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
Artikel sebelumnya:peta golang untuk dihirisArtikel seterusnya:peta golang untuk dihiris