Bash

Cron shell 忽略 runuser 命令 - 為什麼?

  • November 16, 2017

我有兩個 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 沒有解決它)

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。

引用自:https://unix.stackexchange.com/questions/405072