cron은 매우 희박한 PATH를 사용하여 내 bash 스크립트 (백업 스크립트)를 호출합니다 /usr/bin:/usr
. 결과적으로 라인은
lvcreate --size 1G --snapshot ...
터미널에서 스크립트를 실행할 때 잘 작동하지만 crontab에서 실행하면 lvcreate를 찾을 수 없습니다. 유사한 문제가 여기 에 설명 되어 있지만 근본적인 문제를 처리하기위한 일반적인 전략에 더 관심이 있습니다.
지금까지 생각 해낸 아이디어 :
빠른 해결 방법으로 스크립트 맨 위에 PATH를 수동으로 설정했습니다. 나는 또한 crontab에서 이것을 할 수 있습니다. 시스템 전체의 PATH가 변경되면 모든 행을 수동으로 업데이트해야 할 수 있습니다.
더 영구적 인 해결책은 내 스크립트에서 절대 경로를 사용하는 것입니다. 예를 들어 호출을 다음과 같이 대체 /sbin/lvcreate --size 1G ...
하지만이 문제가 처음 발생한 Ubuntu 서버에서는 작동하지만 Arch Linux ARM (RPi)에서 lvcreate는 / usr / bin /.
내가 할 수 which
PATH가 설정된 모든 명령이 제대로 결과를 저장하고 내 스크립트의 상단에 로컬 별칭을 설정,하지만 그건 나에게 약간의 혼란을 보인다.
/ etc / environment 소싱에 대해 생각했습니다. 그것은 내 우분투 머신에서 작동하지만 (일반 데비안에서도 생각합니다), 다시 내 RPi에서 시스템 전체 경로가 설정되지 않았습니다. 같은 이유로 (다양한 배포판에서 특정 파일의 위치 및 / 또는 사용에 의존하고 싶지 않음) .bashrc 또는 이와 유사한 것을 사용하는 것을 주저합니다.
그래서 내 질문은 : 스크립트가 설정된 PATH에 의존하지 않고 여전히 이식 가능한 상태로 유지하는 좋은 방법은 무엇입니까? 최첨단 방법이 있습니까?
PATH
명시 적으로 설정하십시오 .
스크립트에서 수행하면의 현재 설정에 추가 할 수 있습니다 $PATH
. 그러면 거기에있는 모든 것을 존중하고 누락되지 않았는지 확인하려는 것을 추가합니다.
#!/bin/bash
PATH=$PATH:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
...
PATH
실제로 cron 자체의 단점을 해결하기 때문에 crontab 구성에서 설정하는 것이 더 적절할 수 있습니다 (여기서 환경 변수를 설정할 수 있음). 따라서 스크립트를 수정하는 것보다 cron에서 수정하는 것이 더 합리적 일 수 있습니다.
cron에서 설정 한 경우 PATH
현재 값을 참조 할 수 없으므로 설정을 완료 해야합니다 .
# my user's crontab
PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin
0 2 * * * /usr/local/bin/my2amjob.sh
(시스템 중 일부 또는 사용자 자신이 나중에에 나열된 디렉토리에 설치된 더 간단한 버전에 대해 "재정의"를 설치하는지 여부에 따라 약간 다른 디렉토리 순서가 필요할 수 $PATH
있지만 현재 시스템이 설정 한 내용을 확인하고 가능한지 확인하십시오. 그것을 조정하십시오.)
이것이 문제를 해결하기를 바랍니다.
시스템 전체의 PATH가 변경되면 모든 행을 수동으로 업데이트해야 할 수 있습니다.
솔직히 나는 그것에 대해 너무 많이 걱정하지 않을 것입니다. 배포 패키지는 항상 , 또는 아래 /usr/bin
에 바이너리를 설치 하므로 경로 변경없이 항상 액세스 할 수 있습니다. 배포판은 새 디렉토리를 포함 하도록 업데이트 하는 것이 악몽 이라고 오랫동안 생각 했기 때문에 대신 기본 디렉토리에 심볼릭 링크 또는 래퍼 스크립트를 추가하여이를 피했습니다 ./usr/sbin
/bin
/sbin
$PATH
bin
직접 설치하는 소프트웨어의 경우 업데이트를 권장 $PATH
합니다. 동일한 작업을 수행하고 아래에 심볼릭 링크 또는 래퍼 스크립트를 /usr/local/bin
만들고 $PATH
가능하면 변경하지 않는 것이 좋습니다.
Linux 배포판은 $PATH
과거의 문제 에서 이러한 차이를 만들기 위해 몇 가지 조치를 취하고 있습니다 .
먼저 /usr
병합 작업이 있습니다 .이 작업은 /bin
에 대한 심볼릭 링크 /usr/bin
와 /sbin
에 대한 심볼릭 링크로 바뀝니다 /usr/sbin
. 모든 바이너리는 /usr
(패키저가 더 쉽게) 아래에 설치 되지만 여전히 심볼릭 링크 와 같은 절대 경로를 통해 참조 /bin/mytool
하거나 /sbin/mytool
계속 작동 하는 스크립트입니다 . 이것은 Fedora 및 ArchLinux와 같은 배포판에서 채택되었으며 Debian 및 Ubuntu와 같은 다른 배포판은 현재 채택 단계를 거치고 있습니다.
ArchLinux는 한 단계 더 나아간 것처럼 보이며 합병 sbin
되어 bin
함께 . 따라서 병합이 채택 된 최신 ArchLinux에서는 가능한 네 가지 절대 경로 중 하나로 바이너리를 참조 할 수 있으며 찾을 수 있습니다. 다른 배포판도이 두 번째 병합을 채택할지 여부를 확인합니다.
마지막으로 cron에 대한 더 현대적인 대안을 고려할 수 있습니다. Cron은 경험하는 베어 환경과 같은 몇 가지 특이한 점이 있지만 명령 출력 (로깅 시스템을 사용하는 대신) 및 어색한 명령 줄 이스케이프를 위해 이메일을 사용하기도합니다.
우분투와 아치 리눅스는 패키지를 설치할 필요없이 내장 된 시스템 타이머를 지원합니다.
사용 방법에 대한 훌륭한 기사가있는 ArchLinux 위키를 확인하는 것이 좋습니다. 특히 특정 사용 사례에 매우 유용 할 수있는 특정 레시피가 있는 cron 교체로 systemd Timers를 사용하여 확인하고 싶을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다