web-dev-qa-db-ja.com

crontabの@rebootはrootでのみ機能しますか?

man 5 crontabは、crontabを使用して起動時にスクリプトを実行する方法を明確に示しています。

   These special time specification "nicknames" are supported, which replace the 5 initial time and date
   fields, and are prefixed by the `@` character:
   @reboot    :    Run once after reboot.

ですので、crontabに(rootではなく、ユーザーアカウントの下に)単一の行を追加しました。

@reboot     /home/me/myscript.sh

しかし、何らかの理由で、マシンの再起動時にmyscript.shが実行されませんでした。 (コマンドラインから呼び出すと問題なく実行されるため、権限の問題ではありません)

何が欠けていますか?


@Anthonの質問に答えるために更新します。

  1. Oracle-linuxバージョン:5.8(uname:2.6.32-300.39.2.el5uek#1 SMP)
  2. Cronバージョン:vixie-cron-4.1-81.el5.x86_64
  3. はい、/homeisマウントされたパーティション。これが問題のようです。これを回避するにはどうすればよいですか?
  4. 現在、myscript.sh/home/me内のファイルにテキストメッセージをエコーするだけです。
68
Withheld

Cronにはさまざまな実装があるため、これは少し混乱するトピックになる可能性があります。また、この機能を損なういくつかのバグがあり、特にシャットダウン/ブートと再起動を行う場合、単に機能しないいくつかのユースケースもあります。

バグ

データポイント#1

ここでは、Debianのそのようなバグの1つである cron:@rebootジョブが実行されない について説明します。これにより、Ubuntuへの進入も進んだようで、直接確認することはできません。

データポイント#2

Ubuntuのバグの証拠は、このSO Q&Aタイトル: @ reboot cronjob not running )で確認できるようです。

抜粋

コメント#1:.... 3)crondのバージョンが@rebootをサポートしていない可能性がありますvixのcrondを使用していますか? ... crontab -l -uユーザーの結果を表示

コメント#2:...特定のバージョンのcronの@rebootに依存するのではなく、initスクリプトとして設定することをお勧めします。

コメント#3:... @MarkRobertsが再起動を削除し、1 * * * *を*/1 * * * *に変更しました。問題は解決しました!担当者マークはどこに送ればよいですか?ありがとうございました!

そのQ&Aで受け入れられた回答にも次のコメントがありました。

Lubuntuは@Reboot Cron構文をサポートしていません。

追加の証拠

データポイント#3

追加の証拠として、誰かがまったく同じことを試みていて、うまくいかないことに不満を抱いているというスレッドがありました。タイトルは Thread:Cron-@reboot jobs not working です。

抜粋

Re:Cron-@rebootジョブが機能しない

見積もり当初の投稿:ceallred投稿を表示これは私を殺しています...ラッパースクリプトを試しました。手動で実行するとログファイルが生成されます...再起動すると、ジョブは実行されないか、ログファイルが作成されません。

SyslogはCRONがジョブを実行したことを示しています...しかし、再び、出力はなく、プロセスは実行されていません。 Jul 15 20:07:45 RavenWing cron [1026]:(CRON)INFO(Running @reboot jobs)Jul 15 20:07:45 RavenWing CRON [1053]:(ceallred)CMD(/ home/ceallred/Scripts/run_spideroak。 sh> /home/ceallred/Scripts/SpiderOak.log 2>&1&)

Cronが@rebootコマンドを好きではないようです...他のアイデアはありますか?

わかりました...部分的に解決しました。これを解決済みとしてマークし、新しい問題で新しいスレッドを開始します。

答えは、CRONが(/ home/username/scriptsに保存されている)スクリプトを実行しようとしたときに、暗号化されたホームディレクトリがマウントされなかったためだと思います。/usr/scriptsに移動され、ジョブは期待どおりに実行されます。

だから今はスパイダーオークの問題のようです。プロセスは開始しますが、ブートプロセスが終了するまでに、プロセスはなくなります。なんらかの理由でクラッシュが発生していると思います。それについて尋ねる新しいスレッド。

助けてくれてありがとう!

この上のユーザーが問題を理解すると、@rebootをユーザーのcrontabエントリから機能させることができました。

Ubuntuで使用されているcronのバージョンは完全にはわかりませんが、これはユーザーが@rebootも使用できること、またはcronの後続のバージョンのある時点でバグが修正されたことを示しているようです。

データポイント#4

CentOS 6で以下をテストしましたが、うまくいきました。

$ crontab -l
@reboot echo "hi" > /home/sam/reboot.txt 2>&1

その後、システムを再起動しました。

$ Sudo reboot

再起動後。

$ cat reboot.txt 
hi

奪う

  1. この機能は、システムとユーザーの両方のcrontabエントリでサポートされているようです。
  2. 特定のディストリビューションおよび/またはcronパッケージのバージョンでサポートされている/機能していることを確認する必要があります。

実際のメカニズムが@rebootでどのように機能するかについては、内部について説明しているこのブログ投稿を見つけました。タイトルは @ reboot-簡単なcronマジックの説明 です。

Crondのデバッグ

RHEL/CentOS/Fedoraベースのディストリビューションのこの構成ファイルに以下を追加することにより、crondの詳細度を上げることができます。

$ more crond 
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS="-L 2"

有効なレベルは0、1、または2です。このファイルをデフォルトのログレベルに戻すには、状況のデバッグが完了したら、"-L 2"を削除するだけです。

49
slm

私のUbuntuマシンでは、@ reboot時にまだDNSサービスにアクセスできないことがわかりました。これにより、リモートボリュームをマウントできませんでした。このコーニーでありながらシンプルなソリューションが機能しました:

@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log

(ルートcron内。最後の部分はデバッグ専用)

14
André

あなたがすでにこれを解決したかどうか、または上記のいずれかがあなたが必要とした解決策であったかどうかはわかりませんが、別の可能性は次のとおりです:

/ homeディレクトリを暗号化している場合、ログインするまで使用できない可能性があります。つまり、再起動時には使用できません。

このシナリオでは、/ srv、/ opt、/ usr/local/bin /などの別の場所にスクリプトを移動できます。

3
fbas

私はMac OSXも持っていますが、スクリプトが実行されないという同じ問題がありました。しかし、私がスクリプトを好きなように修正したとき

@reboot   cd /home/me/  && sh myscript.sh

私にとってはうまくいきました。次のコマンドを実行して、Shellファイルが実行可能になるようにしてください

chmod +x myscript.sh
3
Kidane

Ubuntu Gnome 13.10(私の場合のデフォルトユーザー:avanderneut)の新規インストールを実行します。

avanderneut@uggo:~$ crontab -l
no crontab for avanderneut
avanderneut@uggo:~$ crontab -e
no crontab for avanderneut - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]: 3
crontab: installing new crontab
avanderneut@uggo:~$ crontab -l | tail -2
# m h  dom mon dow   command
@reboot /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ vi /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ more !$
more /home/avanderneut/bin/on_reboot
#! /bin/bash
echo "Reboot script" > /var/tmp/xxx
avanderneut@uggo:~$ chmod 755 /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
avanderneut@uggo:~$ /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
xxx
avanderneut@uggo:~$ rm /var/tmp/xxx
avanderneut@uggo:~$ Sudo reboot
[Sudo] password for avanderneut: 

そして、ファイルを再起動した後、/var/tmp/xxxありますただし再起動する前にありませんでした。

これはcronバージョン3.0で行われました。

スクリプトの実行時に利用できない可能性があるサービスディスクなどが使用されていないことを確認する必要があります。上記のような簡単なものから始め、電子メールがおそらく起動していないので、端末出力がないことを確認してください。

これがうまくいかず、この機能が必要な場合は、より最新のcron(またはOracle-linuxからのアップグレード)も必要になる場合があります。

1
Anthon

まず、rootとしてログインする必要があります。

須藤-i

次にcrontabを開きます。

crontab -e

その後、以下のようにrootとしてスクリプトをcrontabに追加します。

@reboot root/home/user1/Desktop/my_script

その結果、スクリプトが正しく機能していることがわかりました。

注:現在のユーザーでcrontabを編集すると、再起動してもスクリプトが正しく呼び出されません。

0
Mustafa Kemal

質問に対しては「はい」と答えます。再起動時にcronを実行するのに問題があり(Debian 3.10.70)、次の方法で解決できました:

@reboot root /usr/bin/python3 /path/to/script

そして最後に改行文字'\ n'

これはファイルの内容です:

/etc/cron.d/runOnReboot

最後に、man 5 crontabからの要約に注目する価値があると思います

... cronコマンドのフォーマットは、V7標準に非常によく似ており、多くの上位互換性のある拡張機能があります。各行には、5つの時刻フィールドと日付フィールドがあり、コマンド、改行文字( '\ n')が続きます。システムのcrontab(/ etc/crontab)も同じ形式を使用しますが、コマンドのユーザー名が日時フィールドの後、コマンドの前に指定される点が異なります。フィールドはスペースまたはタブで区切ることができます。コマンドフィールドの最大許容長は998文字です。 ...

0