プロセススケジューリング (crontab)

Linuxで定期的なプロセスの起動はcrontabによって行う。ここではcrontabでプロセススケジューリングを行うにあたって必要な設定を行う手順を開設する。

ログ出力設定


Ubuntu16.04のcronのログはデフォルトでは出力されない。そこで、logの設定ファイル (/etc/rsyslog.d/50-default.conf)でログの出力を有効にする。

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
cron.*                          /var/log/cron.log
#daemon.*                       -/var/log/daemon.log
kern.*                          -/var/log/kern.log
#lpr.*                          -/var/log/lpr.log
mail.*                          -/var/log/mail.log
#user.*                         -/var/log/user.log
リスト1./etc/rsyslog.d/50-default.conf

リスト1に設定ファイルの一部を示す。デフォルトではcron.*の行がコメントアウトされている(先頭に#が付いている)。この#を消して、設定ファイルを保存し、cronを再起動する。

$ sudo service cron restart
リスト2.cronの再起動

これでcronのログが/var/log/cron.logに出力される。

root@semi2017ehr:/var/log# tail -f  cron.log
Oct 12 18:25:01 semi2017ehr CRON[29158]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Oct 12 18:27:13 semi2017ehr crontab[29195]: (semi2017kumw) BEGIN EDIT (semi2017kumw)
Oct 12 18:27:32 semi2017ehr crontab[29195]: (semi2017kumw) REPLACE (semi2017kumw)
Oct 12 18:27:32 semi2017ehr crontab[29195]: (semi2017kumw) END EDIT (semi2017kumw)
Oct 12 18:27:45 semi2017ehr cron[29217]: (CRON) INFO (pidfile fd = 3)
Oct 12 18:27:45 semi2017ehr cron[29217]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
リスト3./var/log/cron.log

また、cronの状態はstatusコマンドで確認できる。

semi2017kumw@semi2017ehr:~$ sudo service cron status
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2019-10-12 19:01:17 JST; 7min ago
     Docs: man:cron(8)
 Main PID: 29661 (cron)
    Tasks: 1
   Memory: 280.0K
      CPU: 489ms
   CGroup: /system.slice/cron.service
           mq29661 /usr/sbin/cron -f

10月 12 19:01:17 semi2017ehr systemd[1]: Started Regular background program processing daemon.
10月 12 19:01:17 semi2017ehr cron[29661]: (CRON) INFO (pidfile fd = 3)
10月 12 19:01:17 semi2017ehr cron[29661]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
10月 12 19:05:01 semi2017ehr CRON[29675]: pam_unix(cron:session): session opened for user root by (uid=0)
10月 12 19:05:01 semi2017ehr CRON[29676]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
10月 12 19:05:19 semi2017ehr CRON[29585]: (CRON) info (No MTA installed, discarding output)
リスト4.cronのstatus

プロセススケジューリング(crontab)


まず、プロセスを起動するシェルスクリプト(~/pill-reminder/pill-reminder.sh)を作成する(実行権限を与える)。

#!/bin/sh
/usr/local/bin/node /home/semi2017kumw/pill-reminder/pill-reminder.js 
   >> /home/semi2017kumw/pill-reminder/pill-reminder.log
リスト5.プロセスを起動するシェルスクリプト


ここで注意が必要なのは、シェルスクリプトはUTF-8(BOMなし)でつくることと改行コードは\nとすること(\r\nにしてはならない)である。シェルスクリプトに\rが含まれていないかどうかは次のコマンドで確認できる。

semi2017kumw@semi2017ehr:~$ od -c ~/pill-reminder/pill-reminder.sh
0000000 357 273 277   #   !   /   b   i   n   /   s   h  \n   /   u   s
0000020   r   /   l   o   c   a   l   /   b   i   n   /   n   o   d   e
0000040       /   h   o   m   e   /   s   e   m   i   2   0   1   7   k
0000060   u   m   w   /   p   i   l   l   -   r   e   m   i   n   d   e
0000100   r   /   p   i   l   l   -   r   e   m   i   n   d   e   r   .
0000120   j   s           >   >       /   h   o   m   e   /   s   e   m
0000140   i   2   0   1   7   k   u   m   w   /   p   i   l   l   -   r
0000160   e   m   i   n   d   e   r   /   p   i   l   l   -   r   e   m
0000200   i   n   d   e   r   .   l   o   g  \n
0000212
リスト6.シェルスクリプトに\rが含まれていないか確認する

もし\rが入っていたら、次のコマンドで\rを除去する。

$ sed -i 's/\r//' ~/pill-reminder/pill-reminder.sh
リスト7.\rの除去

プロセスのスケジューリングはcrontabコマンドで行う。

$ crontab -e
リスト8.crontabコマンド


# m h  dom mon dow   command
0 1 * * * /home/semi2017kumw/pill-reminder/pill-reminder.sh
リスト9.プロセスのスケジュール


これは、毎日午前1時にシェルスクリプトを実行する設定である。設定を終えたらcronを再起動する(リスト2)。

0 件のコメント:

コメントを投稿