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 내부의 에코에는 아무것도 표시되지 않습니다.