えー実務で任意のプログラムをデーモン化させて処理をするという実装があったのでメモ。
デーモンとは?
よく聞くデーモンですが、ものすごく簡単にいうと「常駐化させるプログラム」のことです。httpdなどのように一番最後はdをつけるのが一般的なようです。
参考リンク
Supervisor
任意のプログラムをデーモン化させるソフトとしてはSupervisorというソフトが有名です。
インストール
pythonでも入るようですが、自分はyumで入れました。
CentOS6系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
yum install supervisor mkdir /etc/supervisord.d vim /etc/supervisord.conf ログローテ作成 sh -c "echo '/var/log/supervisor/*.log { missingok weekly notifempty nocompress }' > /etc/logrotate.d/supervisor" #起動スクリプト curl -o /etc/rc.d/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec chmod 755 /etc/rc.d/init.d/supervisord |
また設定ファイル(/etc/supervisord.conf)も見ていきましょう。
/var/wwww/html/hogehoge.phpを常駐させるプログラムだとします。
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
[supervisord] http_port=/var/tmp/supervisor.sock ; (default is to run a UNIX domain socket server) ;http_port=127.0.0.1:9001 ; (alternately, ip_address:port specifies AF_INET) ;sockchmod=0700 ; AF_UNIX socketmode (AF_INET ignore, default 0700) ;sockchown=nobody.nogroup ; AF_UNIX socket uid.gid owner (AF_INET ignores) ;umask=022 ; (process file creation umask;default 022) logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (logging level;default info; others: debug,warn) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=false ; (start in foreground if true;default false) minfds=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) ;nocleanup=true ; (dont clean up tempfiles at start;default false) ;http_username=user ; (default is no username (open system)) ;http_password=123 ; (default is no password (open system)) ;childlogdir=/tmp ; (AUTO child log dir, default $TEMP) ;user=chrism ; (default is current user, required if root) ;directory=/tmp ; (default is not to cd during start) ;environment=KEY=value ; (key value pairs to add to environment) [supervisorctl] serverurl=unix:///var/tmp/supervisor.sock ; use a unix:// URL for a unix socket ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket ;username=chris ; should be same as http_username if set ;password=123 ; should be same as http_password if set ;prompt=mysupervisor ; cmd line prompt (default "supervisor") ; The below sample program section shows all possible program subsection values, ; create one or more 'real' program: sections to be able to control them under ; supervisor. #実際のプログラム名をprogram:プログラム名という方で入れる [program:sampledeamon] #ここに実行プログラムのパスを書きます。 command=/usr/bin/php /var/www/html/hogehoge.php ;priority=999 ; the relative start priority (default 999) autostart=true ; start at supervisord start (default: true) autorestart=true ; retstart at unexpected quit (default: true) ;startsecs=10 ; number of secs prog must stay running (def. 10) ;startretries=3 ; max # of serial start failures (default 3) ;exitcodes=0,2 ; expected exit codes for process (default 0,2) ;stopsignal=QUIT ; signal used to kill process (default TERM) ;stopwaitsecs=10 ; max num secs to wait before SIGKILL (default 10) ;user=chrism ; setuid to this UNIX account to run the program log_stdout=true ; if true, log program stdout (default true) log_stderr=true ; if true, log program stderr (def false) logfile=/var/log/supervisor/sampledeamon.log logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) logfile_backups=10 ; # of logfile backups (default 10) |
なおprogram:プログラム名の設定自体は/etc/supervisord.dのなかに入れる方が一般的かもしれません・・・(通常のapacheなどと同様の書き方です。)
設定ファイルに関しては下記を参考に。
Monitoring a PHP process example with Supervisor
なお下記のような項目も設定項目の中にありますが、webからの設定画面なので省いても構わないと思います。
1 2 3 4 |
[inet_http_server] ; inet (TCP) server disabled by default port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface) username=user ; (default is no username (open server)) password=123 ; (default is no password (open server)) |
実行プログラム
なお実行する側のプログラムは
- ループ性がある
- 単純なループだと負荷がかかるのでsleepなどを入れる
などすると良いと思います。
常駐対象のプログラム(上記例でいうと/var/www/html/hogehoge.php)
1 2 3 4 5 6 |
<?php while (true) { echo "aaaaa"; sleep(2); } |
サービスの開始・停止・確認
この状態で
1 |
service supervisord start |
でスタートです。
ログをみて下記のようになって入ればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
2018-07-21 08:05:14,338 CRIT Supervisor running as root (no user in config file) 2018-07-21 08:05:14,346 INFO /var/tmp/supervisor.sock:Medusa (V1.1.1.1) started at Sat Jul 21 08:05:14 2018 Hostname: <unix domain socket> Port:/var/tmp/supervisor.sock 2018-07-21 08:05:14,387 CRIT Running without any HTTP authentication checking 2018-07-21 08:05:14,388 INFO daemonizing the process 2018-07-21 08:05:14,389 INFO supervisord started with pid 7550 2018-07-21 08:05:14,390 INFO spawned: 'sampledeamon' with pid 7552 2018-07-21 08:05:14,436 INFO localhost:0 - - [20/Jul/2018:23:05:14 +0900] "POST /RPC2 HTTP/1.0" 200 254 2018-07-21 08:05:14,438 INFO localhost:0 - - [20/Jul/2018:23:05:14 +0900] "POST /RPC2 HTTP/1.0" 200 1141 2018-07-21 08:05:15,439 INFO success: sampledeamon entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) 2018-07-21 08:07:51,052 INFO localhost:0 - - [20/Jul/2018:23:07:51 +0900] "POST /RPC2 HTTP/1.0" 200 254 2018-07-21 08:07:51,054 INFO localhost:0 - - [20/Jul/2018:23:07:51 +0900] "POST /RPC2 HTTP/1.0" 200 1164 |
実行中にプロセスのステータスを確認すると下記のようになります。
1 2 3 4 |
service supervisord status supervisord (pid 7550) を実行中... sampledeamon RUNNING pid 7552, uptime 0:02:37 |
ちなみに停止時は
1 |
service supervisord stop |
で止まります。