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 } }() // 代码片段
Atas ialah kandungan terperinci Proses golang hilang dengan sendirinya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!