GMOアドマーケティングのSSP開発チームのT.Kです。
新規でWebAPIを作成する機会があったので、チーム内で流行っているGo言語で実装しました。
デプロイ時にプロセスを再起動する必要があったので、再起動を楽に行うためにrcスクリプトについて調べました。
Go側でPID出力を実装する
プロセスの停止はPIDを指定して行うので、Go側で実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//出力先は --pid-file オプションで指定する pidFilePath := flag.String("pid-file", "", "string flag") flag.Parse() if *pidFilePath != "" { pid := os.Getpid() file, err := os.Create(*pidFilePath) if err != nil { // Openエラー処理 panic(err) } defer file.Close() file.WriteString(strconv.Itoa(pid)) } |
スクリプトファイルを実装する
PIDファイルは
/var/run/ 配下に配置します。
権限の関係で直下に配置できない場合は、ディレクトリを掘って、アクセス権限をもらう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#!/bin/sh # PIDの出力先 PIDFILE=/var/run/your-app.pid # 実行ファイルのPATH PROC=/your-app-dir/your-app # オプションにPIDファイル出力先を指定して、プロセスを起動します start(){ echo "starting ..." ${PROC} --pid-file=${PIDFILE} & return 0 } # PIDファイルが存在していたら、対象プロセスを停止し、PIDファイルを削除します。 stop(){ echo "stopping ..." if [ -f ${PIDFILE} ]; then kill `cat ${PIDFILE}` && rm ${PIDFILE}; fi return 0 } case $1 in start) start ;; stop) stop ;; restart) stop start ;; esac |
まとめ
プロセス再起動に必要最低限の機能を実装しました。
少ない実装で、デプロイ作業がだいぶ楽になりました。
ディストリビューション標準のプログラムにrcスクリプトが含まれているので
機能を充実させたい場合は、参考にすると良いでしょう。