Dockerコンテナを実行しているNASでバックアップスクリプトを開発しています。私のコンテナ内で/ etc / crontabを使用してcronを実行します。
root@backups-nas:/code# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
0 * * * * root /code/backup.sh
また、私のタスクが表示される/var/log/syslogでログを見つけることができるようにsyslog-ngをインストールしました。
root@backups-nas:/code# tail -f /var/log/syslog
==> /var/log/syslog <==
Mar 24 19:00:01 backups-nas CRON[9250]: (root) CMD (/code/backup.sh)
私のスクリプトの内容は次のとおりです。
root@backups-nas:/code# cat backup.sh
#!/bin/bash
python3 /code/backup.py all >> /code/log/$(date +\%d-\%m-\%Y).log
ただし、夜は /code/log/$(date +\%d-\%m-\%Y).log に新しいログライターがなく、操作は完了しません。 /etc/crontab 行を手動で実行しようとすると機能します。
何が起こったと思いますか?事前にありがとう
編集する:
私は次のようにbackup.pyを編集しました。
#!/usr/local/bin/python3
from sys import argv
import datetime
スクリプトを直接実行すると機能しますが、/var/log/syslog.txtの行にもかかわらずcronは実行されません。
答え1
システムcrontabファイルの変数値PATH
を/sbin:/bin:/usr/sbin:/usr/bin
。これは実際にいいえインタプリタパスを含めますpython3
。あなたは言うに横たわっている/usr/local/bin/python3
。
これは、次のいずれかを行う必要があることを意味します。
- に追加してください。 Pythonバックアップスクリプトを呼び出す前にこの行を変更して、crontabファイルでこれを実行する
/usr/local/bin
(システムcrontabファイルのすべての操作に影響を与える)を使用するスクリプトでこれを実行できます。PATH
PATH=
backup.sh
PATH=$PATH:/usr/local/bin
Pythonスクリプトを呼び出すときは、次のように明示的なパスでPythonインタプリタを使用してください。
/usr/local/bin/python3 /code/backup.py all >> "/code/log/$(date +%d-%m-%Y).log"
(
%
ここの文字はエスケープする必要はありません。)明示的なインタプリタをまったく指定せず、スクリプトの -line
#!
に指定されたインタプリタを使用します。/code/backup.py
/code/backup.py all >> "/code/log/$(date +%d-%m-%Y).log"
これはスクリプトの最初の行であり、スクリプトが実行可能()に
backup.py
依存#!/usr/local/bin/python3
しますchmod +x /code/backup.py
。
これらのバリエーションの中で、「最高」(個人的な意見)が最後です。
答え2
今解決しました!デバッグでき、.shではなく/ etc / crontabにtmpにログを追加できます。
問題は簡単です。絶対パスの代わりに相対パスを使用しています。しかし、私の.sh内のエコーには何も表示されません。