Crontab权限被拒绝

4

我在运行脚本时遇到了crontab的问题。

我的sudo crontab -e长这样:

05 00 * * * /opt/mcserver/backup.sh
10 00 * * * /opt/mcserver/suspend.sh
05 08 * * * /sbin/shutdown -r +1
11 11 * * * /opt/mcserver/start.sh  <--- This isn't working

start.sh 文件长这样:

#!/bin/sh
screen java -d64 -Xincgc -Xmx2048M -jar craftbukkit.jar nogui

并且拥有这些权限(ls -l输出)

-rwxr-xr-x 1 eve eve  72 Nov 24 14:17 start.sh

我可以从终端运行该命令,无论是使用sudo还是不使用

./start.sh

但是它不能通过crontab启动。 如果我这样做:
grep -iR "start.sh" /var/log

我获得以下输出
/var/log/syslog:Nov 27 11:11:01 eve-desk CRON[5204]: (root) CMD (eve /opt/mcserver/start.sh)
grep: /var/log/btmp: Permission denied
grep: /var/log/lightdm/x-0-greeter.log: Permission denied
grep: /var/log/lightdm/lightdm.log: Permission denied
grep: /var/log/lightdm/x-0.log: Permission denied

我的问题是,为什么它不起作用?由于我的脚本在没有使用sudo的情况下运行,我不一定需要将其放入sudo crontab中吗?
(我正在使用Ubuntu 12.10)
提前致谢, 菲利普
twalberg的回答:
1.将craftbukkit的所有者更改为root,以查看是否解决了问题。
-rw-r--r-- 1 root root 12084211 Nov 21 02:14 craftbukkit.jar

同时,在我的 start.sh 脚本中添加了一个显式的 cd,如下所示:

#!/bin/sh
cd /opt/mcserver/
screen java -d64 -Xincgc -Xmx2048M -jar craftbukkit.jar nogui

2. 我不太确定你的意思。当我启动Java时,我是否应该在我的start.sh文件中使用以下路径?(从which java输出)

/usr/bin/java

3. 当我的服务器关闭时,屏幕也会被终止。在任何情况下都以“分离模式”启动屏幕是否是一个好主意?

仍然遇到相同的“权限被拒绝”错误。


问题已解决!通过使用屏幕上的适当标志,如下所示,现在它正在按照预期工作!

screen -d -m java -d64 -Xincgc -Xmx2048M -jar craftbukkit.jar nogui

非常感谢回答的人,特别是twalberg!

1
关于#2 - 如果您通常使用/usr/bin/java(只需键入“java”),那么使用它应该没问题 - 我不确定您是否使用了不同的位置,因此我没有建议特定的路径。对于#3,我从未尝试过在没有可用控制终端的情况下启动screen,因此我建议尝试一下这种可能性 - 不确定是否必要,但值得一试。而“Permission denied”来自于grep无法读取这些文件 - 而不是您的cron作业以任何方式失败。 cron是否正在通过电子邮件发送脚本的任何输出? - twalberg
我(愚蠢地)没有设置croncab发送电子邮件。但是现在当我这样做时,我得到了这个错误信息:“必须连接到终端”。所以我猜问题与屏幕有关? - Philip Larson
现在它可以工作了!问题出在我的脚本中没有使用 _screen -d -m_! - Philip Larson
3个回答

1

start.sh 文件的所有者是 "eve:eve",而您的 crontab 正在以 root 用户身份运行。

您可以通过运行以下命令来解决此问题:

chown root:root /opt/craftbukkit/start.sh 

你的 crontab 将以 root 用户身份运行。

提示:在 crontab 中运行 bash 时,始终使用绝对路径(这将使调试变得更加容易)。


1
谢谢您的回答,但这并没有帮助到我。 /var/log/syslog:Nov 27 11:41:01 eve-desk CRON[5445]: (root) CMD (/opt/mcserver/start.sh) grep: /var/log/btmp: 权限被拒绝 grep: /var/log/lightdm/x-0-greeter.log: 权限被拒绝 grep: /var/log/lightdm/lightdm.log: 权限被拒绝 grep: /var/log/lightdm/x-0.log: 权限被拒绝已更改所有者为: -rwxr-xr-x 1 root root 72 Nov 24 14:17 start.sh - Philip Larson
并不是很相关,因为root有权限读取和执行start.sh(尽管我们不知道例如craftbukkit.jar和任何其他文件的权限,这些文件最终root将需要通过运行start.sh来操作)。 - twalberg

1

以下是需要检查的一些事项:

  1. root 显然对 start.sh 有读/执行权限,但是 craftbukkit.jar 的权限是什么 - root 能否读取它?您可能还需要在 start.sh 脚本中添加一个明确的 cd /path/to/where/craftbukkit.jar/is
  2. java 是否在 cronroot 的默认路径中?请注意,此路径不一定与通过 sudosu 或直接以 root 登录获得的路径相同 - 它通常受到更严格的限制。使用完整的路径名来引用 javacraftbukkit.jar 可以解决这个问题。
  3. 由于 screen 不会启动可用的终端,您可能需要使用 screen -d -m ...。希望您最终打算连接到每个 screen 实例并在脚本完成后终止它,或者已经安排它在脚本完成后自动终止...
  4. /var/log/syslog 条目显示,cron 实际上执行了脚本,因此它必须因为上述原因之一而失败(或者是我还没有注意到的其他原因)
  5. grep 的其他错误仅是因为您的非 root 用户没有权限读取那些特定文件(这是正常的,也是一件好事)。

由于格式更好的可能性,已在上方添加了响应。 - Philip Larson

0
日志显示用户无法访问目录“/var/log/”,您应该为cron的所有者设置日志文件的权限。

1
为什么_sudo crontab_无法访问这些/var/log文件?我该如何更改它们?是否应该更改? - Philip Larson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接