Rumah >pembangunan bahagian belakang >Golang >Proses golang hilang dengan sendirinya
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.
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.
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
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. RingkasanApabila 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!