Cronfile没有执行sudo -u line?

时间:2017-09-29 07:38:38

标签: linux cron suse

我已经制作了以下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)

路径:   /选择/ SAP / sapjvm_6 //斌:/选择/富士通/ bwai /斌:/ sbin目录:/ usr / sbin目录:在/ usr / local / sbin中:/根/斌:在/ usr / local / bin目录:在/ usr / bin中:/ bin中:在/ usr / bin中/ X11:在/ usr / X11R6 / bin中:在/ usr /游戏:在/ usr / lib64下/ JVM / JRE / bin中:/ usr / lib中/ MIT /斌:/ usr / lib中/ MIT / sbin目录

1 个答案:

答案 0 :(得分:0)

您有一个非标准的$PATH,而crond(8)正在运行您的crontab(5)条目,其中$PATH更短。另请参阅environ(7)credentials(7)execvp(3)以及execve(2)

我的建议是编写一个完整的shell脚本,并将其仅放在crontab中。因此,请勿在crontab条目中使用sh -c,并明确设置PATH(最好在您的crontab条目触发的shell脚本中,或者可能在您的{ {1}}文件)。

例如你可以

crontab
在您的crontab中

,并以

开头的可执行文件 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /hanamnt/shared/srvmagt.sh 文件
/hanamnt/shared/srvmagt.sh

请注意使用logger(1) - 您应该更明智地使用它来获取#!/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 $0

下的相应日志消息 顺便说一下,你的/var/log太长了太荒谬了。如此长的PATH是混乱的(可能会减慢你的炮弹速度)并且可能存在安全隐患;我的建议是缩短一个(可能短到PATH)并在例如{...}}中添加适当的符号链接或脚本。 $HOME/bin:/usr/local/bin:/bin:/usr/bin$HOME/bin/使用明确的程序路径。

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

另请阅读有关setuid的更多信息。有时使用它(使用setreuid(2))在C中写入包装器setuid-程序是明智的,但要小心(你可能会错误地打开巨大的security holes)。

另请阅读Advanced Linux Programming(可免费下载,有点旧)然后syscalls(2)以更好地了解Linux内部如何工作。您需要更清晰,更清晰地了解您的系统。