crontab执行shell定时任务不成功

借助linux的crontab定时任务不停机清理日志 为了方便定位问题,一般会打开日志记录,但运行一段时间后日志特别大,希望能定期清理,比如只保留近三天的日志。 新建一个shell脚本,clear_up_log.sh,内容如下,对应需要清理的日志路径 yes | cp /dev/null nohup.out 编辑crontab vi /etc/crontab 添加一个任务,时间根据自己的需要设置,我这测试5分钟一次 #执行时间 清理脚本所在位置 */5 * * * * root /cron/clean_up_log 阅读详情

问题:shell脚本手动执行可以,但是使用crontab配置定时,发现执行不成功,但是查看cron日志发现是执行了的
原因分析:crontab执行的时候,就是它总是不会缺省的从用户profile文件中读取环境变量参数,经常导致在手工执行某个 脚本时是成功的,但是到crontab中试图让它定期执行时就是会出错。
解决方式:
a.将shell中命令改成全路径:
本次执行的是前文提到的es备份脚本,执行如下命令:

[root@testserver-2 ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
[root@testserver-2 ~]# echo $PATH
/opt/java/bin:/usr/lib64/qt-3.3/bin:/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/codis/go/bin:/opt/node/bin:/opt/node/node_modules/elasticdump/bin:/root/bin

可以看出crontab中少了很多环境变量,其中包括elasticdump的,继续:

[root@testserver-2 ~]# which elasticdump
/opt/node/node_modules/elasticdump/bin/elasticdump

将此路径加到es_export.sh脚本中,调整crontab,测试,发现仍然不可用
下面接着执行:
b.引用环境变量:
在脚本开头下添加:

. /etc/profile
. ~/.bash_profile

调整crontab,测试,发现仍然不可用
检查脚本发现自己埋下的一个坑:

set -o nounset       #引用未初始化变量时退出
set -o errexit      #执行shell命令遇到错误时退出

当初为了追求完美,加了这个,但是没有考虑到定时任务,因此,注释后,再次调整crontab,问题解决!

总结:
crontab执行shell过程中依赖环境变量,如果不加全路径,就要引用环境变量,因此,最好还是都加上的好,【全路径+环境变量】,完美收官!
注:之前的es导出脚本已经做了修改。

下面我也来试试总结下crontab的基本用法,环境变量以及其他要注意的问题。各位看官可以参考下,有什么问题也可以留言讨论。

————————————————————————————
1.crontab的基本用法
Usage: crontab [-u user] [-e|-l|-r]
Crontab 的格式说明如下:

  • 逗号(‘,’) 指定列表值。如: “1,3,4,7,8″
  • 中横线(‘-’) 指定范围值 如 “1-6″, 代表 “1,2,3,4,5,6″
  • 星号 (‘*’) 代表所有可能的值
    */15 表示每 15 分钟执行一次
# Use the hash sign to prefix a comment
# +—————- minute (0 – 59)
# |  +————- hour (0 – 23)
# |  |  +———- day of month (1 – 31)
# |  |  |  +——- month (1 – 12)
# |  |  |  |  +—- day of week (0 – 7) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed

2.crontab与环境变量
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

3.其他应该注意的问题

1)新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
2)每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。
3)当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错 tail -f /var/log/cron。
4)千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
5)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date+‘’%Y%m%d’在crontab里是不会执行的,应该换成date+’%Y%m%d’。
—————————————————————————————–
/etc/profile, /etc/bashrc, .bash_profile和.bashrc的差别
用户登陆Linux操作系统的时候,"/etc/profile", “~/.bash_profile"等配置文件会被自动执行。执行过程是这样的:登陆Linux系统时,首先启动”/etc/profile",然后启动 用户目录下的"/.bash_profile",如果"/.bash_login"和"/.profile"文件存在的时候也会在执行" /.bash_profile"后被依次调用。

——————

cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
alias vi=vim

通过上面脚本可以看到~/.bash_profile 文件先调用~/.bashrc,然后再把PATH加载。

——————
下面是一些区别:

/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的设置文件中搜集shell的设置;
/etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取;
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件,
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时及每次打开新的shell时,该文件被读取;
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件;
——–
/etc/profile是全局性的功能,其中设置的变量作用于所有用户,~/.bash_profile中设置的变量能继承/etc/profile中的变量并作用于用户。
~/.bash_profile 是交互式、login 方式进入 bash 运行的;~/.bashrc 是交互式 non-login 方式进入 bash 运行的。

Python实现将txt文件转换成对应的excel或csv文件 此外,在上面的例子中,txt文件是以“空格”分隔的,如果遇到“逗号”分隔的,只需将上述代码中的。本文是该专栏的第29篇,后面会持续分享python的各种干货知识,值得关注。工作上可能会遇到这样的情况,使用python将某个txt文本,按照。转换成对应的excel文件或者是csv文件。”需要替换成你的目标txt文件的绝对路径。库,这里直接引用就好。需要注意的是,上述代码中的“ 阅读详情

相关推荐

目标检测中的困难样本挖掘:YOLOv5训练效果提升30%的秘诀

本文深入探讨了目标检测中困难样本挖掘的关键技术,特别是如何通过在线困难样本挖掘(OHEM)策略显著提升YOLOv5模型的性能。文章详细解析了困难样本的分类、识别机制及实战配置,并提供了数据标注策略与增强技巧,最终实现模型性能提升30%的突破。

weixin_30379531的博客 402

linux定时任务执行脚本后没有效果, 日志报错ORPHAN (no passwd entry)

然后再你的crontab -e 中将定时任务命令前面添加 . /etc/profile;/bin/sh 使环境变量生效。使用cat /var/log/cron 发现日志报错ORPHAN (no passwd entry)我的shell脚本遇到了一些问题,直接执行shell命令是没有问题的但是用定时任务却始终没有效果。然后使用 service crond restart 重新启动crontab服务即可。1.需要所有命令都使用绝对路径,不能使用相对路径,可能相对路径识别不到。2.需要再你的sh文件中添加。

小夏卷编程的博客,欢迎大家留言讨论 1613

《跨界杂谈》华为印象(五):高度集权的矩阵式架构

高度集权的矩阵式架构 “高度集权的矩阵式架构”不是官方术语。是笔者的一位同事非常经典的总结。解释这个句话还是有点困难的,笔者入职华为三年也没彻底搞明白,在这里只能尝试性的解释一下。 矩阵 我们先看一下“矩阵”。华为有两套部门职能体系,华为内部术语,叫实线部门和虚线部门。由实线与虚线部门交叉构成矩阵。大部分(但不是所有)华为员工都由两个部门(两个领导)进行管理。对员工而言,所谓的实线部

《云计算架构技术与实践》 2996

shell脚本执行无结果回显事件

有些指令在Linux命令行中明明可以直接执行,为什么但写入shell脚本中却没有回显呢? 正常情况应该是可以在命令行执行的指令,在shell脚本中用``(返单引号)囊括起来便可执行。非正常情况,命令行可执行,shell脚本中执行无回显。 在Linux中有外部命令和内置命令的区分,具体内容可到文章底部附录查看。区分方法:通过which指令,回显结果为no的都是bash内置命令。 同样的脚本,在其他人系统上可能是没有问题的,题主使用的是centos7,也有群友使用centos7可以成功执行脚本。

knightjsh的博客 5149

Kali Linux渗透测试:蚁剑(AntSword)三种安装方法与避坑指南

WebShell管理是渗透测试与网络安全攻防演练中的关键技术环节,它允许安全人员在获得初步访问权限后,对目标系统进行文件管理、命令执行和数据库操作等深度控制。其核心原理是通过在Web服务器上植入特定脚本,建立一条隐蔽的远程管理通道。在实战中,一个高效、稳定的WebShell管理工具能极大提升后渗透阶段的工作效率与成功率。蚁剑(AntSword)作为一款功能强大的国产开源工具,凭借其插件化架构和图形化界面,成为众多安全研究人员的首选。本文将聚焦于如何在渗透测试专用操作系统Kali Linux上部署蚁剑,详细对

weixin_34413103的博客 415

5分钟搞定:用Pyannote和Whisper实现带说话人分离的语音转文字(附完整代码)

本文详细介绍了如何快速构建一个集成了说话人分离功能的语音转文字系统。通过结合OpenAI的Whisper模型进行高精度语音识别和Pyannote模型实现说话人分离,并提供了完整的代码实现、环境搭建指南以及核心的对齐与合并逻辑,帮助开发者高效处理会议录音、访谈等多说话人音频,实现自动化转录。

threejs5artist的博客 635

crontab定时任务执行shell脚本失败问题

shell,flume

qq_40516563的博客 2136

(nginx) nginx5 nginx https部署实战

综上所述,相比 HTTP 协议,HTTPS 协议增加了很多握手、加密解密等流程,虽然过程很复杂,但其可以保证数据传输的安全。所以在这个互联网膨胀的时代,其中隐藏着各种看不见的危机,为了保证数据的安全,维护网络稳定,建议大家多多推广HTTPS。SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐HTTPS 降低用户访问速度(多次握手)网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)

weixin_50382197的博客 1505

【笔记】crontab执行shell命令无效

但添加为crontab计划任务调用shell脚本,就不会被执行,最后分析得到的原因是shell命令路径的问题。目前选择的解决方法是在shell脚本前面加上export PATH=/usr/sbin:$PATH。之前在jenkins也遇到过类似的问题,还有需要注意,调用的脚本或者输出文件,都必须填绝对路径。直接在命令行和shell里调用shell命令是没问题的,比如。

sirria1的专栏 1469

如何在 Mac 上下载安装 Xcode——并为 iOS 开发更新它原文

下载 Xcode安装命令行工具打开新版本删除文件注意,我在下面的步骤中列出了一些终端命令。这些命令可以被输入到你现在的工作目录中。这意味着你不需要导航到任何特定的文件夹。如果你真的想这样做,你可以在输入下面的步骤中的命令之前先输入== cd==。这将使你返回到主文件夹。

专注于AI领域前沿知识,业余爱好开发软件 4670

OCR技术解析:用Tesseract和PaddleOCR识别文本

OCR技术解析:用Tesseract和PaddleOCR识别文本 ,人工智能,计算机视觉,大模型,AI,光学字符识别(Optical Character Recognition,简称 OCR)是一项将图片、扫描件等文档中的文字信息转换为可编辑文本的技术。在数字化时代,OCR 技术广泛应用于文档处理、车牌识别、身份证识别、古籍数字化等领域,极大地提高了文字信息处理的效率。Tesseract 和 PaddleOCR 是两款极具代表性的 OCR 工具。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

cron 定时任务,启动shell脚本,为什么没有执行

Cron作业运行在一个非常简单的环境中,可能没有你的shell环境变量。如果脚本依赖于特定的环境变量,你需要在脚本开头显式设置它们,或在crontab文件中设置。:确保你的cron表达式是正确的。确保你的系统配置了邮件发送(如sendmail或postfix),并检查你的邮件以获得脚本执行的相关信息。Cron可能不会使用你的常规用户环境变量,所以最好在脚本中和cron命令中使用绝对路径,比如调用其他命令或脚本时。:将脚本的输出和错误重定向到日志文件中,这可以帮助你诊断问题。:确保你的脚本具有可执行权限。

keyboard专栏 1691

【图像去噪】论文复现:降维打击!图像对输入变成像素对输入!Pytorch实现Noise2Void(N2V),基于U-Net模型训练,简洁明了理解N2V核心思想!附训练好的灰度图和RGB图的模型文件!

论文题目:Noise2Void-Learning Denoising from Single Noisy Images —— Noise2Void -从单个噪声图像中学习去噪【图像去噪】论文精读:Noise2Void-Learning Denoising from Single Noisy Images(N2V)由于源码是tensorflow版本,本文将基于Pytorch复现。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1356

在命令行直接执行可以执行成功,加入crontab定时任务执行shell脚本不成功失败的问题解决方法

在命令行直接执行可以执行成功,加入crontab定时任务执行shell脚本不成功失败的问题解决方法

GEO,SEO,AI优化,AI搜索优化,生成式引擎优化 570

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

crontab执行脚本失败,手动执行成功问题

今天在使用Linux中的crontab的时候,遇到过手动执行脚本成功,但是通过crontab做成定时任务的时候却无法执行的问题。 首先在一开始使用的时候呢就遇到了这么一个问题: 说root没有crontab。 其实要解决这个问题非常简单,只需要给root创建一个crontab就可以了。 执行crontab -e 按 Esc 按shift+:输入wq 回车。 这样就相当于给root创建了一个空的crontab了。 其实也就是相当于在/var/spool/cron/路径下给创建了一个root的空文件。

TE_M_D的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

利用shell脚本定时执行java程序

最近在工作中遇到一个小需求,需要定时执行java程序,由于是在linux下,很自然想到了利用crontab+shell脚本定时执行java程序。当我按照编写好脚本,手动执行了一下脚本,发现没问题,java程序可以正常运行,于是接着写好定时任务后,然后就这样了,但是过了好几天发现程序一直没有打印日志,我就觉得不对,感觉是定时任务没有执行。于是上网查资料,发现问题所在:有时我们创建了一个crontab...

无忧 2324

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

shell脚本在终端可正常运行,但无法使用crontab执行定时任务

写了一个shell脚本,在终端测试可以正常运行,但是加入到crontab任务里却无法执行。在网上找了一下解决方法,大都是说因为环境问题,可是操作一通后发现并不能解决我的问题。很奇怪:其他shell脚本可以在crontab里执行,我的shell脚本可以在终端中执行,但就是不能让我的shell在crontab里执行。 原因 最后通过排查发现,我在编写crontab文件命令时,传入了一个日期参数$(da...

qq_24082175的博客 2102

shell脚本直接执行没有问题,crontab定时执行失败的解决方法

先查看cron的日志(/var/log/cron),看一下定时任务是否已经执行 如果命令crontab已经执行 1、如果是sh脚本的,直接在脚本的前面加上下面一句就OK了 source /etc/profile 2、如果是python的话 source /etc/profile && python /myfile/myscript.py params ...

夭夜的博客 1070

crontab执行sh无法写入文件

我这里是因为写了一个相对路径,在jar中 如果使用了crontab那生成的文件就在crontab的相对路径了。 所以必须全部写绝对路径,问题解决 sh能执行用了,crontab就不能执行。那么是环境变量的问题 在shell中执行 source /etc/profile即可 ...

前方的路在刚开始 1068

CentOS crontab 定时任务不执行的常见解决方法

crontab 配置文件 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # .—————- minute (0 – 59)  # |  .————- hour (0 – 23) # |  |  .———- day of month (1 – 31) # |  |  |  .——-

Brad_Chen Focus on Linux. 7万+

linux通过crontab命令定时执行shell脚本

linux的crontab指令

qq_45473377的博客 1万+

shell脚本手动执行,但是crontab不执行

遇到个问题:写了个shell脚本,需要定期执行,但是手动执行可以执行,crontab调用却报错。 网上查了各种原因: 基本就是说crontab执行时环境变量的问题。 source /etc/profile 但是这里却不成功,因为涉及到另一个问题 QXcbConnection: Could not connect to display 正在找原因: 一说, crontab执行环境是,命令行,不能...

zhiranyouni的博客 7936

@scheduled每分钟执行一次_为什么我的crontab定时任务不执行?详解crontab命令

linux系统提供at和crontab两个命令来执行定时任务,at主要针对一次性的定时任务,crontab则执行周期性的定时任务。在linux运维中使用较多的还是cronjob,当安装完linux系统后,linux会自动启动crond进程,这是周期性任务的守护进 程,用于检查是否有需要执行的定时任务。crontab命令常用参数:crontab file [-u user] -用指定的文件替代目前的...

weixin_35501172的博客 1651

crontab定时任务不执行原因排查

如果问题依然无法解决,尝试创建一个简单的测试脚本,比如一个只打印当前时间的脚本,来验证cron是否能够正确执行基本任务。可以用如下脚本一分钟执行一次,查看结果很快,也很好验证。如果你以为这是同一个python3,反正都能运行就错了,因为pip list不一样,其中一个没安装各种模块,刚运行就退出,连日志都没有。- 确保脚本运行所需的所有依赖都已正确安装,并且cron用户有权限访问这些依赖,例如python多个版本。Crontab定时任务不执行可能有多种原因。但我后面发现还有另一个python。

weixin_61092302的博客 4569

crontab执行日志_简单介绍Shell中的定时任务 crontab

crondtab进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。这篇文章主要介绍了Shell中的定时任务 crontab,需要的朋友可以参考下crondtab定时任务crondtab是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,crondtab进程每分钟会定期检查是否有要执行的任务,如果有要执行的任...

weixin_39683863的博客 784

crontab不能成功执行shell脚本的可能原因

我们经常会需要使用crontab进行定时任务,但crontab不能成功执行脚本的情况还是很常见,总结起来,本人了解到的和自己遇到的可能原因主要有以下几个: 1. crond进程不存在,该进程是crontab的守护进程,它必须存在才能让crontab正常使用; 2. 系统时间不对; 3. 环境变量的问题:crontab执行脚本的时候不会读取用户的环境变量等配置,所以可...

Arlingtonroad的博客 2271
上一篇: 记一次ipython在CentOS上使用的坑!
下一篇: 错误:软件包:glibc-2.17-196.el7.i686 (centos7)需要:glibc-common = 2.17-196.el7 已安装: gli.......
lcm_linux
博客等级 码龄7年 7258粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值