我需要在 Linux 计算机上运行一个 jar 文件 (datacollector.jar
),例如在固定的时间间隔内运行路径 (/home/vagrant/datatool
)。例如,从 2017 年 10 月 6 日 18:00 到 2017 年 11 月 6 日 03:00 future 某个时间。之后,该进程应该被终止。
我想为此编写一个 shell 脚本,它需要两个参数开始和结束时间。
脚本还应该通知它是否已经在运行,并且我应该能够在结束时间之前手动停止它。
在网上进行了一些研究后,我无法弄清楚这一点。我怎样才能实现这个目标?
我提出了一个解决方案,其中 myshell.sh 采用 4 个参数
[开始日期] [开始时间] [结束日期] [结束时间]。
和脚本代码:
#!/bin/bash
JAR_PATH=/home/vagrant/datatool/datacollector.jar
PID_PATH=/tmp/datacollector-id
#calculate wait time to run the jar
wait=$(($(date -d "$1 $2" "+%s")-$(date "+%s")))
wait_mins=$((wait/60))
#calculate time for which jar file should be executed
run_interval=$(($(date -d "$3 $4" "+%s")-$(date -d "$1 $2" "+%s")))
run_interval_mins=$((run_interval/60))
echo "tool will satrt after $wait_mins"
#wait before running jar file
sleep "$wait_mins"m
#run the jar file
nohup java -jar $JAR_PATH /tmp 2>> /dev/null >> /dev/null &
echo $! > $PID_PATH
#wait for jar execution time
sleep "$run_interval_mins"m
#kill the jar process
PID=$(cat $PID_PATH);
echo "tool process killed"
kill $PID;
echo "program terminated"
我正在使用命令运行代码:
$ nohup ./myshell.sh 2017-06-08 20:07:00 2017-06-08 20:10:00 >> scriptoutput.txt 2>> /dev/null &
和 scriptoutput.txt 包含:
tool will satrt after 3
tool process killed
program terminated
我的代码哪里需要改进?有没有更好的办法呢?
这并不奇怪:考虑到您的帖子,您可能不被允许修改其源代码并重新编译它。因此,你需要一个外部的东西,一些其他的过程什么
- 使用 JVM 启动 jar
- 停止它
- 通知用户其开始和停止。
最简单的方法是
at
命令(您可以用它开始将来的某些事情)
cron
命令(您可以定期在后台使用它执行命令)
- 以及 shell 脚本。
如果只是单次执行,“at
”命令是最好的。
通过谷歌搜索“Linux shell 脚本教程”来了解 Linux shell 脚本。您可以在http://unix.stackexchange.com上获得有关您的问题的更具体的答案。 .
我是一名优秀的程序员,十分优秀!