cron의 PATH 설정은 어디에 있습니까?

cron의 PATH 설정은 어디에 있습니까?

Cron은 crontab 사용자의 경로를 사용하지 않지만 자체 경로를 가지고 있습니다. PATH=/foo/barcrontab 시작 부분에 추가 하면 쉽게 변경할 수 있습니다. 일반적인 해결 방법은 항상 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.dcron이 다른 파일을 읽을 수 있다고 생각합니다.

$ 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

PATHStephen Kitt의 답변에 추가하여 Ubuntu에서 cron을 설정하기 위한 구성 파일이 있습니다 .cron 소홀히 하다하드코딩된 기본값을 사용하십시오 PATH(또는 PATHcrontab 자체에서 설정하십시오). 파일은 /etc/environment.Note cronPAM 구성:

$ 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=barcronjob으로 실행하고 출력에 나타나는 내용을 살펴보세요.env > /tmp/foofoo=bar


그런데 왜? 기본 시스템 전체 경로는 /etc/profile에 설정되어 있지만 다른 디렉터리도 포함됩니다.

$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"

이것은 Arch Linux에서는 사실이지만 Ubuntu에서는 기본 설정이 . 파일이 기존 파일에 추가 된다는 PATH것입니다 ./etc/environment/etc/profile.dPATH~/.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/cronhas를 수정 해도 user_readenv=1아무런 문제가 발생하지 않는 것 같고, 의 변수도 ~/.pam_environment괜찮아 보이기 시작합니다( PATH물론 는 제외).


전체적으로 cron에 대한 환경 변수를 설정하는 것은 번거로운 것 같습니다. 가장 좋은 곳은 작업 사양 자체인 것 같습니다. 상속된 환경 변수 cron이 소스 코드를 읽지 않고 무시하기로 결정할 수 있는지 모르기 때문입니다.

관련 정보