所以我有一个jar文件timeline.jar
,在执行时(使用其目录中的java -jar timeline.jar
)会在其目录中保存一些JSON文件。
但是我需要使用以下命令从Crontab执行timeline.jar
:
5 * * * * java -jar /path/to/timeline.jar
由于我使用绝对路径,因此文件不会保存在jar文件的目录中。
现在唯一的解决方案是指定通过java代码保存JSON文件的确切路径,但我宁愿不像那样硬编码。
当然必须有一种方法来指定"当前目录"从Crontab命令?
如果之前已经问过这个问题,我很抱歉,我读过的答案似乎都没有回答我的问题。谢谢
答案 0 :(得分:2)
当然必须有一种方法可以从Crontab命令中指定“当前目录”吗?
为cron作业指定工作目录的方法是使用作业中的cd
命令切换到正确的工作目录:
5 * * * * cd /path/to && java -jar timeline.jar
使用shell运行Cron作业,因此您可以在作业中使用shell语法。这里的工作是两个命令的序列,cd
命令和java
命令。 '&&'表示第二个命令(java)仅在第一个命令(cd)成功时运行。
在一般情况下,根据正在运行的命令,您可能需要设置环境变量,更改工作目录,或重定向cron作业中的标准输出和标准错误。你可以在shell一行中做所有这些事情。但就个人而言,我尽量避免在crontab文件中使用复杂的shell命令。如果我需要在crontab中执行复杂的操作,我将编写一个shell脚本并让cron运行该脚本:
#!/bin/bash
cd /path/to && java -jar timeline.jar
...
5 * * * * /home/jdoe/bin/launch-timeline-jar.sh
对于手头的情况来说,这无疑是有点过分。但是假设您需要设置命令PATH,并且希望在日志文件中捕获程序的错误消息,并且您希望向日志文件添加时间戳,以便您可以知道哪个运行产生了哪些错误。在shell脚本中表达所有这些内容比直接在crontab文件中表达要容易得多:
#!/bin/bash
PATH=/some/path/bin:${PATH} # Set our PATH
cd /path/to || exit 1 # Set the working directory
exec >> timeline.log 2>&1 # Direct output to a logfile
date # Write a timestamp to the log
exec java -jar timeline.jar # Launch the command we came here for