Cron은 crontab이 있고 대신 자체 경로를 가진 사용자의 경로를 사용하지 않습니다. PATH=/foo/bar
crontab의 시작 부분 에 추가하여 쉽게 변경할 수 있으며 고전적인 해결 방법은 항상 cron이 실행하는 명령에 절대 경로를 사용하는 것이지만 cron의 기본 PATH는 어디에 정의되어 있습니까?
내 아치 시스템 (cronie 1.5.1-1)에서 다음 내용으로 crontab을 만들고 동일한 결과로 Ubuntu 16.04.3 LTS 상자에서도 테스트했습니다.
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
인쇄 :
$ cat fff
/usr/bin:/bin
그런데 왜? 기본 시스템 전체 경로는에 설정되어 /etc/profile
있지만 다른 디렉토리가 포함되어 있습니다.
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
의 관련 아무것도 없다 /etc/environment
또는 /etc/profile.d
나는 아마도 크론 읽을 수 있습니다 생각, 다른 파일은 :
$ grep PATH= /etc/profile.d/* /etc/environment
/etc/profile.d/jre.sh:export PATH=${PATH}:/usr/lib/jvm/default/bin
/etc/profile.d/mozilla-common.sh:export MOZ_PLUGIN_PATH="/usr/lib/mozilla/plugins"
/etc/profile.d/perlbin.sh:[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/vendor_perl ] && PATH=$PATH:/usr/bin/vendor_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/vendor_perl/bin ] && PATH=$PATH:/usr/lib/perl5/vendor_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/core_perl ] && PATH=$PATH:/usr/bin/core_perl
의 파일 중 어느 것도 관련이 /etc/skel
없으며, 당연히, 어떤 /etc/cron*
파일 에도 설정되어 있지 않습니다 .
$ grep PATH /etc/cron* /etc/cron*/*
grep: /etc/cron.d: Is a directory
grep: /etc/cron.daily: Is a directory
grep: /etc/cron.hourly: Is a directory
grep: /etc/cron.monthly: Is a directory
grep: /etc/cron.weekly: Is a directory
/etc/cron.d/0hourly:PATH=/sbin:/bin:/usr/sbin:/usr/bin
그렇다면 사용자 crontab에 대한 cron의 기본 PATH는 어디에 설정되어 있습니까? cron
자체 하드 코딩되어 있습니까? 이것에 대한 일종의 구성 파일을 읽지 않습니까?
/etc/profile
와 동일한 구문 ( var=value
)을 사용하기 때문에 언급 했으므로 내 지식으로는 매우 널리 퍼져 있습니다. 나를 놀라게 한 것은 어디에서나 설정할 수 없어서 하드 코딩 된 것처럼 보입니다. 실제로 스티븐이 아래에서 설명했듯이. cron
/etc/profile
zsh
대화 형 쉘로 사용 하는 사람들 은 신경 쓰지 않습니다 /etc/profile
(특정 bash
)
strings
프로그램에 대해 실행 하면 이러한 하드 코딩 된 값을 찾는 데 도움이 될 수 있습니다.
cron
보고하는/etc/profile
특정 쉘에 대해, 또는주의. 하지 않는 이유 더 나은 질문은cron
읽기PATH
에서login.defs
(리눅스) 또는login.conf
(* BSD에). 나는 그것이 궁극적으로 구현 세부 사항이라고 가정합니다.