Bash
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 沒有解決它)
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。