寫了一支xxx.sh檔放在crontab裡面跑,但是怎麼都沒做到該做的事呢?試著使用sudo /{file path}/xxx.sh之後出現ImportError: No module named {some module},但是把sudo去掉卻可以正常執行,什麼鬼??
由於手上的python程式需要弄到RHEL排程裡面定時執行,將分析結果存到資料表裡面,所以寫了一支.sh檔案,裡面很簡單的判斷一下同一支python程是否還在執行,是的話就直接結束掉,等下一次排程啟動:
#!/bin/bash
if ps -ef | grep -v grep | grep AnalyseJob_36.py ; then
exit 0
else
python36 /{file path}/AnalyseJob_36.py "Analyse Job is not running... Startting now."
exit 0
fi
然後再放進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 execute
#auto analyse new Lots
*/1 * * * * root /{file path}/AnalyseJob_36.sh
弄好之後刷新資料表卻沒看到應該出現的分析結果,怎麼會?如果直接執行.sh檔的話的確有新資料阿!
好,試著用sudo跑一下.sh檔,卻出現了ImportError: No module named {some module},這什麼鬼東西,我明明已經裝了這個module啊?難道加了sudo會用另一個版本的python來跑嗎?查了一下StackOverflow,有大神們提到跟/etc/sudoers有關,所以是執行環境的設定造成。因此先確定一下python36的路徑是在哪邊:
[root@xxxdev03 ~]# which python36
/usr/bin/python36
然後將.sh檔案改寫一下,指定完整路徑給python36:
#!/bin/bash
if ps -ef | grep -v grep | grep AnalyseJob_36.py ; then
exit 0
else
/usr/bin/python36 /{file path}/AnalyseJob_36.py "Analyse Job is not running... Startting now."
exit 0
fi
然後再刷新一下資料表的確就看到分析結果了。不過大神們有多種解決方式,例如修改/etc/sudoers的設定、在crontab裡面直接指定PYTHONPATH、在.sh檔裡面指定PYTHONPATH,或在.py檔表頭增加#!/usr/bin/python36,應該都可以解決這個問題,在這邊留一下紀錄備忘。