使用绝对路径

时间:2016-06-04 09:45:47

标签: java jar terminal crontab absolute-path

所以我有一个jar文件timeline.jar,在执行时(使用其目录中的java -jar timeline.jar)会在其目录中保存一些JSON文件。

但是我需要使用以下命令从Crontab执行timeline.jar

5 * * * * java -jar /path/to/timeline.jar

由于我使用绝对路径,因此文件不会保存在jar文件的目录中。

现在唯一的解决方案是指定通过java代码保存JSON文件的确切路径,但我宁愿不像那样硬编码。

当然必须有一种方法来指定"当前目录"从Crontab命令?

如果之前已经问过这个问题,我很抱歉,我读过的答案似乎都没有回答我的问题。谢谢

1 个答案:

答案 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