Cron 쉘은 runuser 명령을 무시합니다. 이유는 무엇입니까?

Cron 쉘은 runuser 명령을 무시합니다. 이유는 무엇입니까?

두 개의 bash 스크립트가 있습니다. 하나는 루트로 실행되고 다른 사용자는 "병렬"이라고 부릅니다.

/root/cronrun.sh

#! /bin/bash

PARR="thisparameter"

echo "Starting at `date`" >> /root/rlog.log
runuser -l parallels -c "/home/parallels/testscript/newscript.sh $PARR"
echo "Finishing at `date`" >> /root/rlog.log

/home/parallels/testscript/newscript.sh

#! /bin/bash

PARAMM=$1

echo "`date` - newscript.sh ran with $PARAMM" >> /home/parallels/somelog.log

명령줄에서 루트로 /root/cronrun.sh를 실행하세요.

18:17:28 CET 
18:17:29 CET

크론탭에 추가

*/2 * * * * /root/cronrun.sh

따라서 CET 18:20:00에 cron을 통해 실행됩니다.

금후:

/루트/rlog.log

Starting at Thu Nov 16 18:17:28 CET 2017
Finishing at Thu Nov 16 18:17:28 CET 2017
Starting at Thu Nov 16 18:17:29 CET 2017
Finishing at Thu Nov 16 18:17:29 CET 2017
Starting at Thu Nov 16 18:20:01 CET 2017
Finishing at Thu Nov 16 18:20:01 CET 2017

/home/parallels/somelog.log

Thu Nov 16 18:17:28 CET 2017 - newscript.sh ran with thisparameter
Thu Nov 16 18:17:29 CET 2017 - newscript.sh ran with thisparameter

따라서 runuser 셸의 에코 로그 항목이 손실됩니다. 왜 가능합니까? 이 경우 cron은 어떻게 다르게 실행되어 "runuser" 명령이 무시되거나 실패하게 됩니까?

(재현된 시스템은 Ubuntu 16.04.3 LTS입니다.)

(crontab의 SHELL=/bin/bash가 문제를 해결하지 못했습니다)

답변1

cron은 업스트림 Debian에서 볼 수 있듯이 특정 PATH로 실행됩니다.소스 코드:

#ifndef _PATH_DEFPATH
# define _PATH_DEFPATH "/usr/bin:/bin"
#endif

인용하다여기:

#if defined(POSIX)
    setenv("PATH", _PATH_DEFPATH, 1);
#endif

/sbin에 있으므로 runuser전체 경로를 사용하거나 /sbin을 포함하도록 스크립트의 PATH를 설정해야 합니다.

관련 정보