cron を単独で実行すると、init.d スクリプト経由の場合と同じ動作になりますか?

cron を単独で実行すると、init.d スクリプト経由の場合と同じ動作になりますか?

私はサーバー上で cron を起動するコードに取り組んでいます (起動時には実行されません)。 cron を起動するスクリプトは、いくつかのログ記録を設定してから、 を呼び出します。または はcron使用しません。/etc/init.d/cronservice 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。要約すると次のようになります。

  1. アクションはヘルパーを介してstart呼び出すだけです。/usr/sbin/cron/sbin/start-stop-daemon
  2. このstopアクションは、SIGTERMpidfile内のPIDに( を介して/sbin/start-stop-daemon)送信するだけです。
  3. この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。さらに悪いことにstartrestart機能しないのは、クローン既存のpidfileでは失敗しstopクローン作成したインスタンス。

関連情報