web-dev-qa-db-ja.com

docker execがcronで機能していません

コマンドまたは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ファイルにもエラーが表示されない

29
user555

きみの docker execコマンドは、「疑似端末で対話モードで実行する」必要があると言います( -it flags )。cronはTTYに接続しません。

Docker execコマンドをこれに変更してみて、それが機能するかどうかを確認してください?

docker exec mongodb mongodump -d meteor -o /dump/
75
VDR

まったく同じ問題があったからです。 PATHを修正し、権限を変更し、適切なdockerユーザーとして実行していることを確認することはすべて良いことですが、それだけでは十分ではありません。 「docker exec -it」を使用しているため、引き続き失敗します。これは、Dockerに対話型シェルを使用するように指示します。これを「docker exec -t」に変更すると、正常に機能します。ただし、これを示すログ出力はどこにもありません。楽しい!

7
Jason Hughes

1)このタスクがrootユーザーのcrontabにあることを確認します-おそらくそうですが、明示的に作成しなかった

2)cronbashを見つけられない可能性があります。私はそれを削除し、実行可能にした後にスクリプトを直接呼び出します:

chmod 755 /root/scripts/direct.sh

crontabエントリを40 05 * * * /root/scripts/direct.sh 2>&1 >> /root/cron.logとして設定します

それでも機能しない場合は、/root/cron.logにいくつかの有用な出力があるはずです。

4
mbarthelemy

cronデバッグ

1. /var/logまたはsendmail

crondはデーモンとして機能するため、失敗する可能性がないため、実行はロギングよりも重要です。デフォルトでは、何か問題が発生した場合、cronはスクリプト出力とエラーを報告する$USER@localhostにメールを送信します。

一部のメールについては、/var/mailまたは/var/spool/mailをご覧ください。

/etc/aliasesで、ルートのメールの送信先を確認します。

2. crondおよび$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

3.ロギングを強制する

スクリプトの先頭に追加します:

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
2
F. Hauri

スクリプトは実行されていますか? 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

たぶん、あなたは単に再発明したくないだけです ホイール

1
rdupz

ここで私が変更したいことをいくつか示します-最初に、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/

それがより良いものをもたらすかどうかを確認してください。

1
SaintHax