Pipelinenv가 포함된 .sh 스크립트가 수동으로 올바르게 실행되지만 cron을 통해서는 실행되지 않는 이유는 무엇입니까?

Pipelinenv가 포함된 .sh 스크립트가 수동으로 올바르게 실행되지만 cron을 통해서는 실행되지 않는 이유는 무엇입니까?

최근에 오랫동안 실행되던 크론 스크립트에 문제가 발생했다가 갑자기 작동을 멈췄습니다. 스크립트는 루트 crontab에서 실행됩니다. 조직구조는 다음과 같습니다.

  • run_script.shcrontab에서 스크립트를 실행합니다.
  • .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환경 변수는 모든 작업에 대한 읽기 파일에서 설정할 수 있습니다 .crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias각 환경의 결과를 확인하세요.

해당 줄은 기본적으로 해석되기 때문에 command구문이 그보다 간단하므로 환경을 설정한 후 필요한 프로그램을 호출하는 스크립트(실행 가능, 설치, 시작)를 호출하는 것이 좋습니다.crontab/bin/sh/bin/bashcommandbash#!/bin/bash

관련 정보