golang の次のチュートリアル コラムでは、Golang でデーモン プロセスを作成し、スムーズに再起動する方法を紹介します。
PHP 開発のベテランとして。コマンドラインを使用して、nginx や PHP-FPM などの操作を開始/再起動/停止します。非常に感動。もしC/Cを使ってこのようなシステムを開発してくださいと言われたら、私には絶対にそんな気力はありません。しかし、Golangが私の視界に入ってから。すべてとても簡単だと思いました。 1) デーモン プロセスを生成するコードに直接移動します: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 } }
os.StartProcess() 创建守护进程。 syscall.RawSyscall() 创建守护进程。
exec.Command のみがデーモン プロセスを作成する最も高度な方法です。最高のカプセル化。このテストを使用することをお勧めします。
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") }
1) 信号の登録
2) 信号の受信
3) 信号の処理。
以上がGolang がデーモン プロセスを作成し、スムーズに再起動する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。