cron이 사용자의 홈 디렉토리로 변경을 시도하는 이유는 무엇이며 이를 방지하는 방법은 무엇입니까?

cron이 사용자의 홈 디렉토리로 변경을 시도하는 이유는 무엇이며 이를 방지하는 방법은 무엇입니까?

Centos 7에서 cronjob에 대한 새 시스템 계정을 만들고 이에 대한 cronjob을 설정했습니다.

하지만 내 cronjob이 오류와 함께 실행되지 않습니다.

(CRON) ERROR chdir failed (/home/sysagent): No such file or directory

현재 sysagent 계정의 crontab은 다음과 같습니다:

15 16 * * * HOME="/tmp" && cd path/to/project_folder && ./src/mainroutine.sh | ts "[\%Y-\%m-\%d \%H:\%M:\%S]" >> /var/log/automation/sysagent.log

조사한 후 HOME 변수를 추가하고 프로젝트 폴더(쉘 스크립트의 전체 경로가 있었던 폴더)에 cd'd를 추가했지만 도움이 되지 않았습니다. cronjob이 홈 디렉토리를 잊게 만드는 방법은 무엇입니까? 왜 그것을 찾고 있습니까?

답변1

문서가 잘못되었거나 잘못되었다고 가정하면 소스 코드는 다음과 같이 설명합니다.

% rpm -qa | grep cron
cronie-1.4.11-17.el7.x86_64
cronie-anacron-1.4.11-17.el7.x86_64
crontabs-1.11-6.20121102git.el7.noarch

...RPM의 URL이 손상되었기 때문에 일부 altagoobingleduck이 여기에 옵니다...

% git clone https://github.com/cronie-crond/cronie && cd cronie
% fgrep -rl 'chdir failed' .
./src/security.c

cron_change_user_permanently...그래서 오류는 코드의 다른 여러 위치에서 호출된 호출의 한 위치에만 나타납니다.

% grep cron_change_user_permanently **/*.c
src/do_command.c:               if (cron_change_user_permanently(e->pwd, env_get("HOME", jobenv)) < 0)
src/do_command.c:               if (cron_change_user_permanently(e->pwd, env_get("HOME", jobenv)) < 0)
src/popen.c:            if (cron_change_user_permanently(pw, env_get("HOME", jobenv)) != 0)
src/security.c:int cron_change_user_permanently(struct passwd *pw, char *homedir) {

...그래서 모든 경우에 HOME환경 변수는 chdir사용자의 위치를 ​​결정하는 데 사용되는 것으로 나타나며 chdir해당 디렉터리에는 항상 하나가 있습니다. 따라서 해당 HOME디렉토리가 존재하는지 또는 HOME올바르게 설정되었는지 확인해야 합니다.앞으로 cron_change_user_permanently호출됩니다(이는 cron 작업의 셸 코드가 표시되기 전에 발생할 수 있습니다). (또는 cronie다른 작업을 수행하기 위한 원숭이 패치이지만 이는 아마도 매우 나쁜 생각일 것입니다.)

답변2

cron사용자의 를 실행할 때 crontab사용자의 홈 디렉토리에서 시작하려고 합니다. 변수의 초기값은 /etc/passwd(간단한 경우)에서 나옵니다. HOME항목을 덮어쓰려고 할 때 crontab$ cron{HOME}에 대한 변경을 시도했습니다.

관련 정보