コマンドまたはbashスクリプトとしてスタンドアロンで正常に動作する非常に単純なコマンドがありますが、crontabに配置するときはそうではありません
40 05 * * * bash /root/scripts/direct.sh >> /root/cron.log
次の行があります
PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
Shell=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/root/
# Mongo Backup
docker exec -it mongodb mongodump -d meteor -o /dump/
スクリプトのURLを/usr/bin/scirpts/
運に変更しようとしました
私はcronで直接スクリプトを実行しようとしました
26 08 * * * docker exec -it mongodb mongodump -d meteor -o /dump/ >> /root/cron.log
運がなければ、どんな助けも感謝します。
[〜#〜] edit [〜#〜]
/root/cron.log
ファイルにもエラーが表示されない
きみの docker exec
コマンドは、「疑似端末で対話モードで実行する」必要があると言います( -it flags )。cronはTTYに接続しません。
Docker execコマンドをこれに変更してみて、それが機能するかどうかを確認してください?
docker exec mongodb mongodump -d meteor -o /dump/
まったく同じ問題があったからです。 PATHを修正し、権限を変更し、適切なdockerユーザーとして実行していることを確認することはすべて良いことですが、それだけでは十分ではありません。 「docker exec -it」を使用しているため、引き続き失敗します。これは、Dockerに対話型シェルを使用するように指示します。これを「docker exec -t」に変更すると、正常に機能します。ただし、これを示すログ出力はどこにもありません。楽しい!
1)このタスクがrootユーザーのcrontabにあることを確認します-おそらくそうですが、明示的に作成しなかった
2)cron
がbash
を見つけられない可能性があります。私はそれを削除し、実行可能にした後にスクリプトを直接呼び出します:
chmod 755 /root/scripts/direct.sh
crontabエントリを40 05 * * * /root/scripts/direct.sh 2>&1 >> /root/cron.log
として設定します
それでも機能しない場合は、/root/cron.log
にいくつかの有用な出力があるはずです。
/var/log
またはsendmail
crond
はデーモンとして機能するため、失敗する可能性がないため、実行はロギングよりも重要です。デフォルトでは、何か問題が発生した場合、cron
はスクリプト出力とエラーを報告する$USER@localhost
にメールを送信します。
一部のメールについては、/var/mail
または/var/spool/mail
をご覧ください。
/etc/aliases
で、ルートのメールの送信先を確認します。
$PATH
Cronでコマンドを実行する場合、$PATH
がユーザーのデフォルトパスおよびnotroot default path(つまり、*/sbin
およびスーパーユーザーツールへの他の予約済みパスはありません)。
このための簡単な方法は、すべてが正常に実行される環境でデフォルトのパスを出力することです:
echo $PATH
または、コマンドラインからスクリプトにパッチを適用します。
sed -e "2aPATH='$PATH'" -i /root/scripts/direct.sh
これにより、スクリプトの2行目に現在の$PATH
初期化子が追加されます。
または、これにより、スクリプトから他のすべてのPATH=
:
sed -e "s/PATH=[^ ]*\( \|$\)/\1/;2aPATH='$PATH'" -i /root/scripts/direct.sh
スクリプトの先頭に追加します:
exec 1>/tmp/cronlog-$$.log
exec 2>/tmp/cronlog-$$.err
これを試して:
sed -e '1a\\nexec 1>/tmp/cronlog-$$.log\nexec 2>/tmp/cronlog-$$.err' -i ~/scripts/direct.sh
#!/bin/bash
# uncomment two following lines to force log to /tmp
# exec 1>/tmp/cronlog-$$.log
# exec 2>/tmp/cronlog-$$.err
PATH='....' # copied from terminal console!
docker exec -it mongodb mongodump -d meteor -o /dump/
スクリプトを実行する場合
40 05 * * * bash /root/scripts/direct.sh
実行可能フラグは必要ありませんが、追加する必要があります。
chmod +x ~/scripts/direct.sh
実行したい場合:
40 05 * * * /root/scripts/direct.sh
スクリプトは実行されていますか? touch /tmp/cronok
呼び出しの前にdocker exec
などの他のコマンドを追加します。
Crontabは最後に改行が必要であることを忘れないでください。 crontab -e
を使用して編集します。
Cronサービスを再起動し、ログ(grep -i cron /var/log/syslog
)を確認します。
OSがredhat/centos/Fedoraの場合、頻度とコマンドの間でユーザー名(root
)を試してください。
mail
コマンドでメールを確認してください。
Crontabの許可を確認してください。 chmod 644 /etc/crontab
。
たぶん、あなたは単に再発明したくないだけです ホイール 。
ここで私が変更したいことをいくつか示します-最初に、STDOUTとともにSTDERRをキャプチャし、cronのシェル仕様を削除します-#を使用します!代わりにスクリプトで。
40 05 * * * /root/scripts/direct.sh &>> /root/cron.log
次に、PATHを逆の順序で設定していますが、shbangがありません。ダッシュではなくbashを実行しているときに、なぜシェルを/ bin/shとして定義しているのかわかりません。スクリプトをこれに変更します。
#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/root
PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# Mongo Backup
docker exec -it mongodb mongodump -d meteor -o /dump/
それがより良いものをもたらすかどうかを確認してください。