linux定时任务生效_crontab定时任务不执行,单独运行sh生效

本文介绍了Linux定时任务(crontab)不执行时的排查步骤,包括检查crond服务状态、阅读mail中的错误信息、确认环境变量设置、使用bash执行复杂命令、封装命令到独立脚本,并提供了一个完整示例脚本。
摘要由CSDN通过智能技术生成

虽然已经从事运维两三年了。 但是今天写的计划任务没有执行,排除了下, 这里整理下,方便后期查看。

排除思路

1. 确保crond服务是开机自启和当前是启动的。

# centos 7systemctl status crond

systemctl start crond

# centos5,6service crond status

chkconfig crond on

2. 检查mail邮件里面关于该计划任务的错误信息。

mail

这里借用下网络上面的图过来下,

f30354f615cdf7ab2128c9aeb3684cc2.png

这个情况,一般这些环境配置在profile文件中的, 可以在脚本中source下这个文件, 让其生效,或者把对应的配置写到脚本里面来。

source /etc/profile

3. 脚本里面的命令程序没有在PATH里面。

脚本里面执行的命令,没有在计划任务执行的环境变量里面有, 需要添加进path或者命令写全路径。

# 在可以执行的终端内获取所有PATH, 写入脚本中echo$PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/php/bin:/usr/local/docker/bin:/usr/local/java/jdk1.8.0_191/bin:/usr/local/java/jdk1.8.0_191/jre/bin:/usr/local/flume/bin:/usr/local/go/bin:/usr/local/go/bin:/root/bin

#在执行脚本中加入如下类似行

PATH=/usr/local/bin:$PATH

4. 使用bash替换

使用crontab -e编辑的计划配置行中, 命令是有限制的, 重定向和特殊符号是不支持的, 这些是bash提供的,可以使用如下方式配置。

# add by zhaojiedi 2019.08.30

14 * * * * bash /usr/local/bin/backup_k8s.sh

5. 封装下计划任务脚本行

我们在计划任务行,写的命令如果长并且带有一些date命令等, 建议把这些命令写入到一个新的文件里面去, 计划任务命令行写这个新的文件作为命令执行。

# 原来计划任务行* * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh# 改写后的echo "cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh" > /usr/local/bin/top10.sh

* * * * * bash /usr/local/bin/top10.sh

最后放一个完整点的计划任务脚本

#!/bin/bash

source/etc/profile

PATH=/usr/local/bin:$PATH

base_dir=/alidata/k8s_backup

dt=$(date "+%F/%T")

cmd_history_file="/usr/local/limikeji/bin/cmd_history.txt"# 先处理有命名空间的

kubectl api-resources |grep true |awk 'BEGIN {OFS=" "; FIELDWIDTHS="34 13 31 13 50"}{if (NR >1)print $5,$1,$4,$3}' |while read kind name has_namespace group ; do#echo "$kind $name $has_namespace $group"api_path="$kind"cmd="kubectl get $api_path --all-namespaces -ocustom-columns=name:.metadata.name,namespace:.metadata.namespace"$cmd| awk '{if(NR>1)print $0}' |while read record_name ns ; do

file="$base_dir/$dt/$ns/$api_path/${record_name}.yml"

mkdir -pv $(dirname $file)

cmd="kubectl -n $ns get $api_path/$record_name -oyaml"

echo $cmd >>$dt_$cmd_history_file

$cmd> $file

done

done# 后处理无命名空间的

kubectl api-resources |grep false |awk 'BEGIN {OFS=" "; FIELDWIDTHS="34 13 31 13 50"}{if (NR >1)print $5,$1,$4,$3}' |while read kind name has_namespace group ; do#echo "$kind $name $has_namespace $group"api_path="$kind"cmd="kubectl get $api_path -ocustom-columns=name:.metadata.name"$cmd| awk '{if(NR>1)print $0}' |while read record_name ; do

file="$base_dir/$dt/NONENAMESPACE/$api_path/${record_name}.yml"

mkdir -pv $(dirname $file)

cmd="kubectl get $api_path/$record_name -oyaml"

echo $cmd >>$dt_$cmd_history_file

$cmd> $file

done

done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值