crontab 任务程序执行乱码的问题

今天碰到一个坑爹的问题,定时用php程序从远程的mssql读取数据,并写入到mysql中,手动用php执行程序的时候,程序运行没有问题,但当用crontab任务定时执行php程序的时候就出问题了,插入mysql数据中文乱码。

刚开始以为是编码的问题,调了mysql的编码,调了linux系统的编码,发现都不行。通过各种搜索才知道,原来手动运行与crontab任务运行的环境是不同的。

环境变量相关配置文件

  • /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 运行的

通常二者设置大致相同,所以通常前者会调用后者。

大家都知道crontab是个好东东,可以定时执行一些任务,帮助你监控系统状况,帮助你每天重复的做一些机械的事情。但是crontab有一个坏毛病,就是它总是不会缺省的从用户profile文件中读取环境变量参数,经常导致在手工执行某个脚本时是成功的,但是到crontab中试图让它定期执行时就是会出错

一般crontab无法运行的问题都是由环境变量在crontab中不一定可识别引起的。

在运行crontab的时候,是non_login方式调用程序的,此时~/.bash_profile并不会被提前调用。所以,crontab的运行环境相对于login方式进入bash运行的环境来说小得多。如果程序涉及~/.bash_profile使用的环境变量,那么,部分在login方式可以正常运行的程序在crontab下就无法运行。

所以解决办法就是用以下命令:source ~/.bashrc && cd /root && 你要执行的命令

时间: 2024-10-07 07:07:24

crontab 任务程序执行乱码的问题的相关文章

运维经验分享(六)-- 深究crontab不能正确执行Shell脚本的问题(二)

运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)> <运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析> <运维经验分享(五)-- 改进的java进程管

OpenWRT添加 crontab开机默认执行

[转载请注明出处:钱国正专栏 http://blog.csdn.net/qianguozheng/article/details/37666829] OpenWRT系统默认已经添加了crond,只是没有配置默认配置参数,致使服务起不来. 主要步骤: 1. 修改启动脚本/etc/ini.d/cron /etc/rc.d/S50cron为/etc/ini.d/cron的链接 <span style="font-size:18px;">#!/bin/sh /etc/rc.comm

inotify+rsync实现实时同步(附解决crontab中无法执行python脚本的问题)

1.准备环境 # 系统支持的话,下面的目录就会存在 ls /proc/sys/fs/inotify/ rpm -qa inotify-tools yum -y install inotify-tools 2.inotifywait监控目录状态变化 /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e delete,create,close_write /data # 可以把时间去掉 /usr/bin/

普通用户 crontab 任务不执行

今天发现在linux下,普通用户的crontab任务不执行.网上搜了好多,好多说要在执行的脚本前面加上如下内容 if [ -f ~/.bash_profile ]; then . ~/.bash_profile fi 加了之后测试,没有任何作用.不知道是不是只有执行脚本在用户根目录才有作用. 最后发现要在脚本开头加入以下内容才可以 #!/bin/bash #set -x source ~/.bash_profile 其中第一行的作用是指明此脚本使用/bin/bash来解释执行. 第二行可以没有

Spark的应用程序执行模型

今天看了一篇名为Top 3 Troubleshooting Tips to Keep You Sparking的文章,讲述了一些编写Spark程序需要注意的地方,看完之后想要总结一下. Spark执行模型,总结为官方的架构图: 本文主要讨论Driver和Worker. 我们知道,对于Spark开发的分布式应用程序,和写普通的scala程序基本类似.所以这时往往会陷入一些误区: 在Spark开发的应用程序的对象里,我给他们分成2类对象: 1.闭包内的对象:即在类似map, filter, redu

java 程序执行输出有两种简单方式

java 程序执行输出有两种简单方式: 1. System.out.println("需要输出的内容"): 该方法可参看运行一个简单的Java程序 结果图: 2. System.out.print("需要输出的内容"): 1 public class HelloWorld 2 { 3 //Java程序的入口方法,程序将从这里开始运行 4 public static void main(String[] args) 5 { 6 //向控制台打印一条语句 7 Syste

如何让linux定时任务crontab按秒执行

如何让linux定时任务crontab按秒执行? linux定时任务crontab最小执行时间单位为分钟 如果想以秒为单位执行,应该如何设置呢? 思路 正常情况是在crontab中直接定义要执行的任务,现在我们在中间添加一个脚本文件 自定义一个脚本文件,循环执行要执行的任务,循环中使用sleep来控制间隔秒数 在crontab中添加一个任务,设置为每分钟都执行这个脚本 就是用crontab控制分钟,用脚本内的循环来控制秒 示例 (1) 定义目标任务 用php写了一个测试任务,向文件中写一个时间信

程序执行流程(粗略)

程序执行流程(粗略) 用户发出请求 前台进行js规则验证(良好的用户体验) 按照一定的规则进行数据提交 (数据没有封装的提交 和 数据封装过后的提交) 控制层进行数据的接收 1.进行数据的非空.规则验证 || 规则验证可以读取配置文件 2.处理session信息 3.进行权限的验证 || 可以使用权限拦截器或过滤器 # 分清数据来源::: 来源于用户输入(输入数据 ), 来源于系统生成(当前时间) , 默认值在业务层之中设置保证业务的可移植性 # 在调用业务之前一定要保证将业务需要的信息已经进行

控制文件读写操作次数,提高程序执行的效率(经验)

编程时经常会遇到文件读写的操作,文件的读写相对于内存操作来说,速度非常慢.因此编程时,需要控制文件读写的次数,以提高程序执行的效率.以下列代码为例,进行说明. words = ['a', 'b', 'c', 'd'] for i in range(4): for line in file('file_read.txt'): if(words[i] in line): print(line) for line in file('file_read.txt'): for i in range(4):