Cron shell 忽略 runuser 命令 - 为什么?

Cron shell 忽略 runuser 命令 - 为什么?

我有两个 bash 脚本。一个以 root 身份运行,并将另一个称为用户“并行”

/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 身份从命令行运行 /root/cronrun.sh

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

添加到 crontab

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

所以它通过 cron 在欧洲中部时间 18:20:00 运行

在这之后:

/root/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 shell 中的 echo 日志条目丢失了。为什么它可以成为可能?在这种情况下,cron 的运行方式有何不同,导致“runuser”命令被忽略/失败?

(重现的系统是Ubuntu 16.04.3 LTS)

( crontab 中的 SHELL=/bin/bash 没有解决它)

答案1

cron 使用特定的 PATH 运行,如上游 Debian 中所示源代码

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

参考这里

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

由于runuser位于 /sbin 中,因此您需要使用它的完整路径,或者在脚本中设置 PATH 以包含 /sbin。

相关内容