
私はサーバー上で cron を起動するコードに取り組んでいます (起動時には実行されません)。 cron を起動するスクリプトは、いくつかのログ記録を設定してから、 を呼び出します。または はcron
使用しません。/etc/init.d/cron
service cron start
この方法で cron を起動すると、service cron status
問題service cron stop
なく動作しているようで、指定された PIDFILE が/etc/init.d/cron
存在します。
にログ ラインを入力しました/etc/init.d/cron
が、cron
スタンドアロンで実行してもスクリプトは呼び出されないようです。
# service cron status
script is running
* cron is running
# service cron stop
script is running
* Stopping periodic command scheduler cron [ OK ]
# cron
#
ここで何が起こっているのでしょうか? これは単に、cron
バイナリと /etc/init.d/cron スクリプトが pidfile の場所に対して同じ規則を使用しているためでしょうか?
答え1
あなたの仮説は正しいです:ヴィクシー・クロンpidfile の場所が固定されており ( /var/run/crond.pid
)、これも 2 回実行されるのを防ぎます。
の初期化スクリプトは、 によっても呼び出され、service
標準の を使用します/lib/lsb/init-functions
。要約すると次のようになります。
- アクションはヘルパーを介して
start
呼び出すだけです。/usr/sbin/cron
/sbin/start-stop-daemon
- この
stop
アクションは、SIGTERM
pidfile内のPIDに( を介して/sbin/start-stop-daemon
)送信するだけです。 - この
status
行為は に相当するkill -0 $(cat /var/run/crond.pid)
。
しかし、もしあなたがシステムインストールされると、標準のinit関数が書き換えられ/lib/lsb/init-functions.d/40-systemd
、実行される。クローン直接は検出されなくなりました:
piotr@bialykiel:~$ sudo /usr/sbin/cron
piotr@bialykiel:~$ sudo /etc/init.d/cron status
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sun 2020-02-02 09:12:43 CET; 5min ago
Docs: man:cron(8)
Process: 734 ExecStart=/usr/sbin/cron -f $EXTRA_OPTS (code=killed, signal=TERM)
Main PID: 734 (code=killed, signal=TERM)
以来システムサービスごとに設定したいCGroup
。さらに悪いことにstart
、restart
機能しないのは、クローン既存のpidfileでは失敗しstop
、クローン作成したインスタンス。