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 && 你要執行的命令

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM