Cronfile 没有执行 sudo -u 行?

Cronfile did not execute sudo -u line?

我制作了以下 cronjob sh 文件:

Vi RestartServices.sh


/etc/init.d/b1s stop
sleep 10
/etc/init.d/sapb1servertools stop
sleep 10
sudo -u ndbadm /usr/sap/NDB/HDB00/HDB stop
sleep 20
sudo -u ndbadm /usr/sap/NDB/HDB00/HDB start
sleep 10
/etc/init.d/sapb1servertools start
sleep 10
/etc/init.d/b1s start

当我手动 运行 此文件时,作业 运行 正确。

在 crontab 中安排时(root 用户)

Crontab 内容:

# srvmagtCron: restarts daemons that died
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/sh -c "[ -x     /etc/srvmagt/srvmagtCron ] && /etc/srvmagt/srvmagtCron"
0 2 * * * /hanamnt/shared/NDB/HDB00/backup/scripts/VGRbackup.sh
#RESTARTS SERVICE LAYER , SAPB1ServerTools service , HDB
0 3 * * * /hanamnt/shared/NDB/HDB00/backup/scripts/RestartServices.sh

它确实在要求的时间启动,但我认为它未能执行 sudo 行,因为 HDB 服务尚未重新启动。

我想知道为什么? 是因为 sudo 不能在 cronjob 中执行吗? (服务需要使用用户ndbadm启动)

路径: /opt/sap/sapjvm_6//bin:/opt/fujitsu/bwai/bin:/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin :/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin

你有一个不标准的$PATH and crond(8) is running your crontab(5) entries with a shorter $PATH. See also environ(7), credentials(7) and execvp(3) with execve(2)

我的建议是写一个完整的 shell 脚本,并且只把它放在 crontab 中。因此,不要在 crontab 条目中使用 sh -c,并明确设置 PATH(或者,最好是,在 shell 脚本中,您的 crontab 条目正在触发,或者可能在你的 crontab 文件)。

例如,您可以

0,5,10,15,20,25,30,35,40,45,50,55 * * * *  /hanamnt/shared/srvmagt.sh

在您的 crontab 中,并有一个 可执行文件 /hanamnt/shared/srvmagt.sh

开头的文件
#!/bin/bash
export PATH=/opt/sap/sapjvm_6//bin:/opt/fujitsu/bwai/bin:/sbin:\
/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:\
/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:\
/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin
# log a starting message
logger start of [=11=]

注意 logger(1) 的使用 - 您应该更明智地使用它来获取 /var/log

下的适当日志消息

顺便说一句,您的 PATH 太长了。这么长的 PATH 很乱(并且可能会减慢您的 shell 速度)并且可能存在安全风险;我的建议是使用更短的链接(可能短至 $HOME/bin:/usr/local/bin:/bin:/usr/bin)并添加适当的符号链接或脚本,例如$HOME/bin//usr/local/bin/ 使用显式程序路径。

注意 sudo 可以用在 crontab 作业中(但这通常是不明智的),然后可能应该在 /etc/sudoers 中配置;也许你应该更喜欢 /bin/su(见 su(1)...)在一些 shell 脚本中。

另请阅读有关 setuid. Sometimes it is wiser to write in C a wrapper setuid- program using it (with setreuid(2)), but be careful (you could open huge security holes 的更多信息。

另请阅读 Advanced Linux Programming (freely downloadable, a bit old) then syscalls(2) 以更好地理解 Linux 的内部工作原理。您需要在脑海中更好、更清晰地了解您的系统。