web-dev-qa-db-ja.com

cronジョブが実行されていません

Minecraftの世界を5分ごとにラムから救うために、cronジョブを作成していました。スクリプトをテストしたところ、機能しているようです。

スクリプトは次のようになります。

#!/bin/sh


VOLATILE="/home/jonathan/Games/Minecraft/Server/world/"
PERMANENT="/home/jonathan/Games/Minecraft/Server/world_storage/"
rsync -r -t -v "$VOLATILE" "$PERMANENT"

そこで、cronジョブを追加して5分ごとにスクリプトを実行しましたが、実行されていないようです。

これは私が使用したスクリプトです:

*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh

誰でも私を助けてくれますか?

1
user77242

Cronjobの追加方法を指定しませんでした。これは大きな違いをもたらします:自分のアカウント内でcrontab -eを使用した場合、スクリプトはユーザーで実行されます(したがって、crontabエントリのフィールドは1つ少なくなります-実行するユーザーは、それが知られているように)。上記のスニペットを単に/etc/cron.dにコピーした場合、ユーザーを指定しなかったため(または「bash」という名前のユーザーが見つからなかったため)失敗します。したがって、次の手順を実行する必要があります。

  1. cronジョブの追加方法に関する情報で質問を更新します
  2. システムログを確認します(/var/log/syslog。エラーが発生する可能性があります)
  3. Backup.shスクリプトにデバッグ出力を追加して、開始されるかどうかを確認します

3番目のポイントは、複数の方法で実現できます。

  • >>/tmp/testlog.logをcrontabエントリの最後に追加します(出力を調査可能なファイルにリダイレクトします。さらに、2>&1にはエラーコンソールからの出力が含まれます)
  • たとえば、スクリプト自体にいくつかの行を追加します。 echo "Backup.sh started">/tmp/testlog.log

さらに:bashを使用してスクリプトを実行する場合は、/bin/sh(デフォルトのUbuntuインストールでdashを使用するように)を使用するように指示するのではなく、/bin/bashを使用する必要があります。次に、実行可能にします。crontabエントリから「bash」を省略することもできます。

更新:

私の答えに対するあなたのコメントによると、あなたはcrontab -eを使用してジョブを作成し、システムログに従って実行されますが、定義はむしろ

*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh &>/dev/null

これにより、すべての出力がシステムの最大のストレージである「ブラックホール」にリダイレクトされます。/dev/nullはすべてを消費します(ただし、何も返しません)。このようにSTDOUTとSTDERRをリダイレクトすると、エラーレポートが失われます。したがって、詳細はもちろんのこと、エラーが発生したこともまったくわかりません。テストでは、&>/dev/null部分を完全に省略する必要があります。それが機能する場合でも、不必要な出力のみを抑制する必要があります。少なくともアンパサンドを省くと、Cronは発生したエラーを報告できます。

さらに:(あなたの場合のように/dev/nullに)出力がリダイレクトされると、最後に別のリダイレクトを追加しても結果は得られません。したがって、上記のアドバイスを「追加... crontabエントリの最後に追加」から「crontabエントリの置換」に調整する必要があります;)

5
Izzy