Cron은 crontab 사용자의 경로를 사용하지 않지만 자체 경로를 가지고 있습니다. PATH=/foo/bar
crontab 시작 부분에 추가 하면 쉽게 변경할 수 있습니다. 일반적인 해결 방법은 항상 cron이 실행하는 명령의 절대 경로를 사용하는 것입니다. 그러나 cron의 기본 PATH는 어디에 정의되어 있습니까?
Arch 시스템(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
cron이 다른 파일을 읽을 수 있다고 생각합니다.
$ 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
그렇다면 cron 사용자 crontab 세트의 기본 PATH는 어디에 있습니까? 자체적으로 하드코딩되어 있나요 cron
? 이에 대한 일종의 구성 파일을 읽지 않습니까?
답변1
하드코딩되어 있습니다.소스 코드(이 링크는 현재 데비안에 대한 것입니다 cron
- 다양한 구현을 고려하면 cron
하나를 선택하기 어렵지만 다른 것들도 비슷할 수 있습니다):
#ifndef _PATH_DEFPATH
# define _PATH_DEFPATH "/usr/bin:/bin"
#endif
cron
기본 경로는 구성 파일에서 읽히지 않습니다. 그 이유는 이미 모든 cronjob에서 사용되는 경로 지정을 지원하므로 PATH=
다른 곳에서 기본값을 지정할 필요가 없기 때문인 것 같습니다. (하드코딩된 기본값 사용작업 항목의 경로를 지정하는 다른 항목이 없는 경우.)
답변2
PATH
Stephen Kitt의 답변에 추가하여 Ubuntu에서 cron을 설정하기 위한 구성 파일이 있습니다 .cron
소홀히 하다하드코딩된 기본값을 사용하십시오 PATH
(또는 PATH
crontab 자체에서 설정하십시오). 파일은 /etc/environment
.Note cron
PAM 구성:
$ cat /etc/pam.d/cron
...
# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session required pam_env.so
# In addition, read system locale information
session required pam_env.so envfile=/etc/default/locale
...
이는 확인하기 쉽습니다. /etc/environment
예를 들어 변수를 추가하여 foo=bar
cronjob으로 실행하고 출력에 나타나는 내용을 살펴보세요.env > /tmp/foo
foo=bar
그런데 왜? 기본 시스템 전체 경로는 /etc/profile에 설정되어 있지만 다른 디렉터리도 포함됩니다.
$ grep PATH= /etc/profile PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
이것은 Arch Linux에서는 사실이지만 Ubuntu에서는 기본 설정이 . 파일이 기존 파일에 추가 된다는 PATH
것입니다 ./etc/environment
/etc/profile.d
PATH
~/.pam_environment
아치 동작 관련 버그.
불행하게도 /etc/pam.d/cron
읽기는 포함되지 않습니다 ~/.pam_environment
. 이상한 점은,/etc/pam.d/atd
하다다음 파일을 포함합니다:
$ cat /etc/pam.d/atd
#
# The PAM configuration file for the at daemon
#
@include common-auth
@include common-account
session required pam_loginuid.so
@include common-session-noninteractive
session required pam_limits.so
session required pam_env.so user_readenv=1
...그러나 전달된 명령은 at
분명히 작업이 생성되었을 때 사용 가능한 환경을 상속합니다 at
(예: env -i /usr/bin/at ...
매우 깨끗한 환경에서 작업을 실행하는 것처럼 보입니다).
/etc/pam.d/cron
has를 수정 해도 user_readenv=1
아무런 문제가 발생하지 않는 것 같고, 의 변수도 ~/.pam_environment
괜찮아 보이기 시작합니다( PATH
물론 는 제외).
전체적으로 cron에 대한 환경 변수를 설정하는 것은 번거로운 것 같습니다. 가장 좋은 곳은 작업 사양 자체인 것 같습니다. 상속된 환경 변수 cron이 소스 코드를 읽지 않고 무시하기로 결정할 수 있는지 모르기 때문입니다.