【问题标题】:Cronfile did not execute sudo -u line?cronfile 没有执行 sudo -u 行?
【发布时间】:2018-03-11 01:50:37
【问题描述】:

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

【问题讨论】:

  • 显示准确您的脚本(每个代码行前有四个空格)和您的crontab 条目。阅读有关 PATH 的更多信息 - 您的 crontab 和您的终端中可能有所不同,您也应该展示它。所以编辑你的问题来改进它。你的脚本可执行吗?
  • BTW sudo 可用于 cronjob(但您可能更喜欢 /bin/su 在特定情况下),但您可能需要配置更多 /etc/sudoers 文件
  • 适当地格式化您的问题:每个代码或命令行前四个空格!还要显示你的PATH - 至少echo $PATH 的输出!
  • 您仍然需要重新编辑。我猜有些<br/> 是错误的
  • 抱歉我是新手

标签: linux cron suse


【解决方案1】:

您有一个非标准的$PATH 并且crond(8) 正在运行您的crontab(5) 条目,而$PATH 更短。另请参阅 environ(7)credentials(7)execvp(3)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 $0

注意logger(1) 的使用 - 您应该更明智地使用它以在/var/log 下获取适当的日志消息

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

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

阅读更多关于setuid的信息。有时用 C 编写一个使用它的包装器 setuid 程序(使用 setreuid(2))会更明智,但要小心(您可能会错误地打开巨大的 security holes)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多