编写一个程序自动将cron作业添加到crontab文件中,但作业并没有运行。

4

我正在使用以下Java代码将cron作业写入我的crontab文件

PrintWriter writer = new PrintWriter("/var/spool/cron/crontabs/multi","UTF-8");
        String cronTabString="25 13 * * * sudo wget --tries=0  \"https://some-url.com:7443/DataUpdater/updateChildren?folderId="+folderId+"&clientId="+clientId+"&clientSecret="+clientSecret+"&refreshToken="+refreshToken+"&deptName="+deptName+"\"";
        writer.println(cronTabString);
        writer.close();

代码成功写入cron定时任务文件。但是它没有运行。我的问题是:是否可能以这种方式执行cron作业?根据我所知道的,这是一个有效的cron定时任务记录,因此应该执行。我在这里缺少什么吗?


我不知道这是否是一个好习惯。但是你的 cron 记录可能由于 sudo 而未能运行。sudo 需要输入用户密码。 - linuxartisan
我知道这不是一个好的做法,但正如@anacron所说,我们可能需要启动或重新加载cron守护进程。这在程序上是否可行?如果cron表项由于sudo而未运行,那么我怎么能写入文件呢? - Saurabh Chaturvedi
更新 -- 移除 sudo 也没有帮助 !!! - Saurabh Chaturvedi
2个回答

3
“crontab”调度程序不仅是一个文件,它同时也是作为守护进程运行的进程。当您传统地编辑“crontab”文件时,它会保存“crontab”条目并重新加载“crontab”进程。因此,仅仅写入文件是没有帮助的。您需要重新加载或重启cron守护进程。

更新

如果您在服务器上有root访问权限,则可以使用以下命令重启cron守护进程:

/etc/init.d/cron reload

因此,在运行于服务器上的Java程序中,您需要执行以下操作:

Runtime.getRuntime().exec("/etc/init.d/cron reload");

这将运行系统命令以重新启动cron守护进程并重新加载cron条目。

希望这有所帮助!

更新2

不同版本的Linux有不同的命令来重启服务或守护进程。

您可以使用此作为检查将哪个命令作为参数传递到上面的“exec”方法的好起点。

不同Linux版本上的Cron命令语法


你有什么建议可以编程地重新加载或重启cron守护进程吗?更具体地说,使用Java? - Saurabh Chaturvedi
你的Java程序是否在同一台服务器上本地运行? - anacron
谢谢!这看起来很有前途。我会在我的系统上尝试一下,然后告诉你结果。 - Saurabh Chaturvedi
你的回答很有帮助。再加上@flu的回答,我终于让它正常工作了。非常感谢!! - Saurabh Chaturvedi

3
请尝试以下操作:
crontab -r
crontab /var/spool/cron/crontabs/multi

(编辑) 我相信在Java中,你可以这样调用:

Runtime.getRuntime().exec("crontab -r");
Runtime.getRuntime().exec("crontab /var/spool/cron/crontabs/multi");

第一个命令用于删除现有的定时任务表。第二个命令用于安装新的定时任务表。然后,您可以通过执行以下命令来验证:

crontab -l

非常感谢!!! 这个方法很有用。想知道这样做是否也允许我将多个cron作业附加到crontab文件中同时执行。 - Saurabh Chaturvedi
是的,您应该能够以这种方式将作业附加到文件并重新加载。调用“crontab -r”并不是必要的,但调用它不会影响您的文件。 - flu
嗯...我也会尝试的!! @flu 再次感谢! - Saurabh Chaturvedi
@flu - 在JavaScript中是否有可用的替代方案?基本上在NodeJS中? - Shruthi Bhaskar
@ShruthiBhaskar - 你好,很抱歉我不熟悉JavaScript,但这是一个shell命令。因此,我建议您检查JavaScript如何与shell交互并调用命令,那么很可能是可以实现的。 - flu

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