日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常

發布時間:2024/8/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原因: crontab 沒有去讀環境變量,需要再腳本中手動引入環境變量,可以用source 也可以用export 寫死環境變量。

為了定時監控Linux系統CPU、內存、負載的使用情況,寫了個Shell腳本,當達到一定值得時候,發送郵件通知。需要用到Crontab的定時任務去執行這個腳本,但是發現通過命令(./test.sh)執行Shell文件的時候,可以獲取Linux的環境變量;可是通過Crontab做的定時任務,無法獲取。

查找資料之后發現,crontab有一個壞毛病,就是它總是不會缺省的從用戶profile文件中讀取環境變量參數,經常導致在手工執行某個 腳本時是成功的,但是到crontab中試圖讓它定期執行時就是會出錯。

2種方法可以解決這個問題,

1、在Shell文件里面獲取環境變量值的路徑寫成絕對路徑,別用環境變量的路徑值。例如獲取CPU的使用情況 ?通過絕對路徑/proc/cpuinfo 來獲取值;

2、Shell腳本缺省的#!/bin/sh開頭換行后的第一行用

#!/bin/sh

. /etc/profile

. ~/.bash_profile

這樣,crontab在執行腳本的時候,就能夠讀到用戶的環境變量參數

備注:

如果你是在cron里提交的,請注意:

不要假定c r o n知道所需要的特殊環境,它其實并不知道。所以你要保證在s h e l l腳本中提供所有必要的路徑和環境變量,除了一些自動設置的全局變量。

分享一些關于Crontab的小知識

但是最近在使用crontab過程中,接連遇到頭疼的問題:手動執行腳本時一點問題都沒有,可是放在 crontab中腳本死活也不運行。最后查出來原因一次是因為腳本里面文件路徑沒有寫全路徑導致的,另一次是因為腳本運行需要依賴java環境變量,其實 兩次都是環境變量的問題造成的。從網上同樣了解到一般crontab無法運行的問題都是由環境變量在crontab中不一定可識別引起的。某前輩總結 說:crontab如果不注意的話早晚會出問題,而且這種問題一旦出一次,就會永遠記得,因為這種問題很折騰人。精辟啊~~

下面我也來試試總結下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目錄的設置文件中搜集

/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 運行的。

總結

以上是生活随笔為你收集整理的contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。