크론 작업으로 실행될 때 스크립트에 환경 변수가 표시되지 않습니다.

크론 작업으로 실행될 때 스크립트에 환경 변수가 표시되지 않습니다.

( ) cronjob에서 스크립트를 호출하면 root'ipset을 찾을 수 없습니다'라는 메시지와 함께 실패합니다. 문제가 있는 스크립트 줄은 다음과 같습니다.

for i in $(cat /etc/cn.zone); do ipset -A china $i; done

스크립트 앞의 일부 줄은 이 명령을 호출합니다.

ipset -N china hash:net

그래서 문제의 ipset이 실제로 생성되었습니다.

루트의 홈 디렉토리에서 이 스크립트를 실행하면 완벽하게 실행됩니다.

오류의 원인이 무엇인지 아시나요?

답변1

크론 작업으로 실행될 때 스크립트에 환경 변수가 표시되지 않습니다.

( ) cronjob에서 스크립트를 호출했는데 root'ipset을 찾을 수 없습니다'라는 메시지와 함께 실패합니다...

이 스크립트를 Bash 스크립트로 실행하고 있습니까? 요즘 대부분의 쉘 스크립트는 무엇입니까?

그렇다면 스크립트의 첫 번째 줄을 다음에서 변경하십시오.

#!/bin/bash

이에:

#!/bin/bash -l

을 추가하면 -lBash가 로그인 셸로 호출된 것처럼 실행되도록 지시합니다. 그리고 Bash 스크립트가 해당 cron 작업의 로그인 셸을 통해 실행되면 일반적으로 로그인 셸을 통해 설정되는 모든 환경 변수 및 기타 항목을 해당 Bash 스크립트에서 사용할 수 있으므로 ipset예상대로 실행할 수 있습니다.


여러분이 할 수 있는 또 다른 트릭은 which이와 같은 Bash 변수 내에서 사용하는 것입니다. 당신은 분명히 그것을 사용하고 있으므로 $(cat /etc/cn.zone)메커니즘은 비슷합니다.

$(which ipset)

그리고 스크립트에서 줄을 다음과 같이 변경하세요.

for i in $(cat /etc/cn.zone); do $(which ipset) -A china $i; done

수행할 작업은 를 사용하여 실행 중인 시스템에 상관없이 which스크립트에 전체 경로 ipset(예: )를 제공하는 것입니다. /sbin/ipset그런 다음 이를 통해 구문 분석된 변수로 설정하면 $()스크립트 자체가 이를 실행할 수 있습니다.

ipset그러나 스크립트의 다른 곳에서 사용하므로 이 방법을 사용하는 경우 스크립트 상단 근처에 다음과 같은 변수로 which설정하도록 스크립트를 리팩터링하는 것이 좋습니다.ipset

ipset_bin=$(which ipset);

그런 다음 다음과 같이 명령을 호출하십시오.

$ipset_bin -N china hash:net

이:

for i in $(cat /etc/cn.zone); do $ipset_bin -A china $i; done

답변2

쉘은 환경에 의해 설정되지만 동일한 환경을 공유하지 않는 를 ipset살펴보는 것과 같이 실행 파일을 찾을 수 있는 위치를 알고 있습니다.PATHcron

이를 (또는 스크립트) 상단에 추가하면 crontab예상한 대로 명령을 찾을 수 있는 위치를 알 수 있습니다.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

관련 정보