Linux中crontab定时任务不执行的原因
<p>最近在linux中遇到了个crontab定时任务不执行的case,在这给大家分享一下,避免踩到我遇到的坑。</p>
<p>
先贴脚本吧</p>
<p>
为了方便展示,把脚本入参,都写死了</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_8071">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash preprocessor bold">#!/usr/bin/env bash</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash comments"># 1输出文件,到log 例如: bg </code>
</div>
<div class="line number3 index2 alt2">
<code class="bash comments"># 2 目标文件目录 不带最后的/ 例如:/opt/flume/home/hdp_lbg_ectech/rawdata/xxx/web_vip_bg</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash comments"># 3 执行的时候选择前几天的日志 例如:1</code>
</div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
<code class="bash plain">LAST_DAY=$(</code><code class="bash functions">date</code> <code class="bash plain">+</code><code class="bash string">"%Y-%m-%d"</code> <code class="bash plain">-d </code><code class="bash string">"1 days ago"</code><code class="bash plain">)</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash plain">LAST_HOUR_DAY=$(</code><code class="bash functions">date</code> <code class="bash plain">+</code><code class="bash string">"%Y%m%d"</code> <code class="bash plain">-d </code><code class="bash string">"1 days ago"</code><code class="bash plain">)</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash comments">#执行jar获取bg日志</code>
</div>
<div class="line number9 index8 alt2">
<code class="bash spaces"> </code><code class="bash plain">java -jar </code><code class="bash plain">/opt/script/xxx/vipbg/vip-bg-job-1</code><code class="bash plain">.0-SNAPSHOT-shaded.jar </code><code class="bash plain">/opt/script/xxx/vipbg/bg</code><code class="bash plain">.log</code>
</div>
<div class="line number10 index9 alt1">
</div>
<div class="line number11 index10 alt2">
<code class="bash comments">#具体到文件名</code>
</div>
<div class="line number12 index11 alt1">
<code class="bash plain">SRC_FILE=</code><code class="bash plain">/opt/script/xxx/vipbg/bg</code><code class="bash plain">.log</code>
</div>
<div class="line number13 index12 alt2">
</div>
<div class="line number14 index13 alt1">
<code class="bash comments">#指定目标目录,按日期创建目录</code>
</div>
<div class="line number15 index14 alt2">
<code class="bash plain">DEST_DIR_NAME=</code><code class="bash plain">/opt/flume/home/hdp_lbg_ectech/rawdata/xxx/web_vip_bg/</code><code class="bash plain">$LAST_HOUR_DAY</code>
</div>
<div class="line number16 index15 alt1">
<code class="bash plain">DEST_FILE_NAME=$(</code><code class="bash functions">basename</code> <code class="bash plain">$SRC_FILE)</code>
</div>
<div class="line number17 index16 alt2">
<code class="bash comments">#FLUME会忽略隐藏文件,所以可直接拷贝过去</code>
</div>
<div class="line number18 index17 alt1">
<code class="bash plain">TMP_FILE=$DEST_DIR_NAME/.$DEST_FILE_NAME</code>
</div>
<div class="line number19 index18 alt2">
<code class="bash plain">DEST_FILE=$DEST_DIR_NAME/$DEST_FILE_NAME.$SRC_IP</code>
</div>
<div class="line number20 index19 alt1">
<code class="bash comments">#判断源文件是否非空,空文件Flume会直接删除的,且目标文件不存在,避免重复拷贝数据</code>
</div>
<div class="line number21 index20 alt2">
<code class="bash keyword">if</code> <code class="bash plain">[ -s </code><code class="bash string">"$SRC_FILE"</code> <code class="bash plain">] && [ ! -f </code><code class="bash string">"$DEST_FILE"</code> <code class="bash plain">];</code><code class="bash keyword">then</code>
</div>
<div class="line number22 index21 alt1">
<code class="bash spaces"> </code><code class="bash comments">#使Flume具有删除该目录下文件的权限,不然FLUME收集不上去</code>
</div>
<div class="line number23 index22 alt2">
<code class="bash spaces"> </code><code class="bash functions">mkdir</code> <code class="bash plain">-p $DEST_DIR_NAME && </code><code class="bash functions">chmod</code> <code class="bash plain">777 $DEST_DIR_NAME</code>
</div>
<div class="line number24 index23 alt1">
<code class="bash spaces"> </code><code class="bash comments">#必须先cp到一个临时文件再mv过去,直接cp过去会造成数据丢失</code>
</div>
<div class="line number25 index24 alt2">
<code class="bash spaces"> </code><code class="bash functions">cp</code> <code class="bash plain">$SRC_FILE $TMP_FILE && </code><code class="bash functions">mv</code> <code class="bash plain">$TMP_FILE $DEST_FILE</code>
</div>
<div class="line number26 index25 alt1">
<code class="bash keyword">fi</code>
</div>
<div class="line number27 index26 alt2">
<code class="bash comments">#删除tmp中转文件</code>
</div>
<div class="line number28 index27 alt1">
<code class="bash functions">rm</code> <code class="bash plain">-rf </code><code class="bash plain">/opt/script/xxx/vipbg/bg</code><code class="bash plain">.log</code>
</div>
<div class="line number29 index28 alt2">
<code class="bash functions">echo</code> <code class="bash string">"删除源文件成功"</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
有些目录用了xxx代表</p>
<p>
这个脚本单独考出来可以执行,放到crontab里面就不执行了, 百度了下,大多都说需要使用绝对路径,看了下我们的脚本,就是下面这句有问题:</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code20852">
<br>
java -jar /opt/script/xxx/vipbg/vip-bg-job-1.0-SNAPSHOT-shaded.jar /opt/script/xxx/vipbg/bg.log</div>
<br><p>
</p>
<p>
初步判断是java这需要使用jdk的目录路径,做了两个实验测试了下。</p>
<p>
<strong>crontab中加上一个 java -jar xxxx.jar的定时任务</strong></p>
<p>
代码如下:</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code12566">
<br>
10 16 * * * java -jar /opt/script/xxx/vipbg/vip-bg-job-1.0-SNAPSHOT-shaded.jar /opt/script/xxx/vipbg/bg.log</div>
<p>
</p>
<p>
果然,这个没有执行</p>
<p>
<strong>crontab中加上一个 jdk目录/bin/java -jar xxxx.jar的定时任务</strong></p>
<p>
代码如下:</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code90540">
<br>
20 16 * * * /opt/soft/jdk/jdk1.6.0_45/bin/java -jar /opt/script/xxx/vipbg/vip-bg-job-1.0-SNAPSHOT-shaded.jar /opt/script/xxx/vipbg/bg.log</div>
<p>
</p>
<p>
这次执行了,没有执行的原因就是执行jar的时候,需要加上jdk的路径</p>
<p>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
原文链接:https://www.jianshu.com/p/20fd3fa063b1</p>
頁:
[1]