최근에 오랫동안 실행되던 크론 스크립트에 문제가 발생했다가 갑자기 작동을 멈췄습니다. 스크립트는 루트 crontab에서 실행됩니다. 조직구조는 다음과 같습니다.
run_script.sh
crontab에서 스크립트를 실행합니다.- .sh 스크립트에서 특정 디렉토리로 이동한 다음 실행합니다.
pipenv run python script.py
수동으로 실행하면 잘 작동 run_script.sh
하지만 cron에 의해 트리거되면 python3(script.py는 python3으로 작성됨)에 있지만 python2에는 없는 라이브러리를 가져오는 중 오류가 반환됩니다. 따라서 로그에는 가져오기 라이브러리 오류만 표시되지만 어떤 이유에서든 파이프라인을 사용하여 venv를 설정하는 데 문제가 있는 것 같습니다.
변경을 시도했지만 run_script.sh
여전히 pipenv run python3 script.py
동일한 오류 로그가 나타납니다.
또한 cron 파일에서 PATH 환경을 설정하고 run_script.sh
기존 PATH에 python3 경로를 추가해 보았지만 나에게도 효과가 없었습니다.
마지막으로 내 sudo apt update && upgrade
컴퓨터는 여전히 스크립트를 실행할 수 없습니다.
uname -a
합계의 출력은 다음과 같습니다 lsb_release -a
.
Linux ubuntu 5.7.0-2-amd64 #1 SMP Debian 5.7.10-1 (2020-07-26) x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
미리 감사드립니다!
답변1
작업이 에 의해 실행 중이 cron
거나 systemd
시작 스크립트가 데스크탑에서 실행 중인 것과 동일한 런타임 환경에서 실행되고 있지 않습니다. systemd
로 스크립트를 시작합니다 root
. 변경 사항이나 기타 환경 변수 설정은 작업 PATH
에 자동으로 전파되지 않습니다 cron
. 예를 들어 no $DISPLAY
이므로 GUI 프로그램에는 특별한 처리(읽기 man xhost
)가 필요합니다.
cron
환경 변수는 모든 작업에 대한 읽기 파일에서 설정할 수 있습니다 .crontab
man 5 crontab
echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
각 환경의 결과를 확인하세요.
해당 줄은 기본적으로 해석되기 때문에 command
구문이 그보다 간단하므로 환경을 설정한 후 필요한 프로그램을 호출하는 스크립트(실행 가능, 설치, 시작)를 호출하는 것이 좋습니다.crontab
/bin/sh
/bin/bash
command
bash
#!/bin/bash