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 的内部工作原理。您需要在脑海中更好、更清晰地了解您的系统。
我制作了以下 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 的内部工作原理。您需要在脑海中更好、更清晰地了解您的系统。