背景
最近公司項目在進(jìn)行架構(gòu)升級醋火,硬件環(huán)境也由原來的AIX遷移到了Linux瞬哼,硬件環(huán)境的不同也導(dǎo)致了較多問題。其中之一就是驳阎,crontab調(diào)用腳本監(jiān)控系統(tǒng)運(yùn)行情況,然而用戶執(zhí)行腳本與crontab執(zhí)行產(chǎn)生了一定的差異馁蒂。
排查
- 首先呵晚,腳本內(nèi)容并沒有太大改動,僅僅是將一些變量取值的寫法更新的更為準(zhǔn)確沫屡。
- 其次饵隙,腳本中的第三方命令均使用全路徑引用,不存在找不到命令的問題沮脖。
- 然后金矛,我又比對了crontab與手工執(zhí)行腳本的運(yùn)行日志芯急。crontab運(yùn)行日志的時間戳全部為數(shù)字與英文結(jié)合,而手工執(zhí)行的運(yùn)行日志中的時間戳則是數(shù)字與漢字相結(jié)合驶俊;crontab的運(yùn)行日志顯示連接數(shù)據(jù)庫查詢數(shù)據(jù)失敗了娶耍,而手工執(zhí)行的運(yùn)行日志則顯示一切正常。
經(jīng)過排查废睦,結(jié)果顯而易見伺绽,crontab執(zhí)行腳本時缺少用戶手工執(zhí)行腳本時的一些環(huán)境變量养泡。用戶在登錄服務(wù)器時嗜湃,會默認(rèn)加載當(dāng)前用戶的環(huán)境變量(用戶環(huán)境變量的配置以及加載不在此做過多贅述)。而crontab就不一定了澜掩,以老的AIX環(huán)境為例购披,crontab是會擁有當(dāng)前用戶的環(huán)境變量的,這也是為什么之前都是正常運(yùn)行的肩榕;而新的Linux環(huán)境刚陡,明顯就是必須要顯示地引入當(dāng)前用戶的環(huán)境變量,否則會出現(xiàn)一系列問題株汉。
實際上筐乳,一開始我是不建議將當(dāng)前用戶的所有環(huán)境變量都引入的,畢竟權(quán)限大了乔妈,誰也控制不住蝙云。我的想法是引入部分必要的環(huán)境變量就好,其他的環(huán)境變量路召,要用時再說勃刨。但是作為一名開發(fā)人員,我對Linux運(yùn)維這塊并不是過多了解股淡,于是就找了公司里相關(guān)的運(yùn)維老師身隐。然而,在重試多次后唯灵,那位運(yùn)維老師直接將當(dāng)前用戶的所有環(huán)境變量都引入了贾铝,簡單粗暴。然后我就在嘀咕“問題原因我早就找到了埠帕,我只是想要一個最優(yōu)解忌傻,然而你卻把我最初的想法告訴了我,那我豈不是舍近求遠(yuǎn)搞监?水孩??”琐驴。最后在項目組成員都本著“能正常運(yùn)行就行”的基本原則俘种,還是采用了全量引入當(dāng)前用戶環(huán)境變量的方法秤标。
解決
有兩種引入方式:
1.在crontab中引用當(dāng)前用戶環(huán)境變量
# 在引入環(huán)境變量的同時,也可以指定腳本的解釋器
20 03 * * * (. /etc/profile;/bin/sh /var/test.sh)
20 03 * * * (. ~/.profile;/bin/sh /var/test.sh)
2.在腳本中引用當(dāng)前用戶環(huán)境變量
source /etc/profile