幾個月前服務器的OS從Ubuntu 10.04轉為CentOS6.5,安裝好wine後手動運行shell腳本可以正常運行指定的exe程序(腳本和Ubuntu中的一樣),於是就直接修改crontab定時自動運行該腳本。
最近卻才發現該exe並未自動執行過一次(該exe作用的作用是反編譯apk包獲取apk信息),於是立刻去查找問題原因,初步推測為以下幾點:
1.crontab配置出錯
在另一台服務器運行是正常的,現在在這個上面就一直出錯,使用命令行去執行該腳本也是可以正常執行,生成xml文件。
2.wine運行該exe程序失敗
在shell腳本中將wine運行exe的正常輸出及異常輸出重定向到指定文件(&>> 追加到文件末尾)。於是發現初步原因:
wine: '/' is not owned by you, refusing to create a configuration directory there
奇怪的錯誤,明明在shell腳本中將wine運行exe的正常輸出”解決方法是檢查該用戶主目錄所屬和權限是否正確,發現簡單的解決方法是執行前設置一個wine變量——$WINEPREFIX,具體方法是
export WINEPREFIX=/home/username/.wine
或
env WINEPREFIX=/home/username/.wine
這只會在本shell及其子shell中生效。終於可以執行wine……查看日志發現wine雖然可以運行,但是繼續報錯;exe程序輸出的中文也變成了?。
我選擇先解決exe輸出中文亂碼的問題,也就是字符編碼問題。在shell腳本中輸出一下
echo $LANG &>> yourlog
於是發現手動運行與自動運行的區別,手動是zh_CN.UTF-8,自動是en_US.UTF-8……好辦,相同的處理方法,執行前設置變量LANG為zh_CN.UTF-8,成功輸出中文。
再解決wine的報錯
err:menubuilder:write_freedesktop_mime_type_entry error writing file //.local/share/mime/packages/x-wine-extension-cpl.xml
這個時候我開始懷疑CentOS的crontab執行指定用戶的命令時缺少了一些必要的初始化操作。再次google,在wine的官網發現類似的問題
err:menubuilder:write_freedesktop_mime_type_entry error writing file /home/mark/.local/share/mime/packages/x-wine-extension-cpl.xml
仔細比較,mark的該xml文件是在自己的主目錄下的!輸出一下主目錄
echo $HOME &>> yourlog
手動是/home/username,自動是……空,無語問蒼天。相同的處理方法,執行前設置變量LANG為/home/username,成功解決wine的報錯。
結語
至此,可以確認CentOS的crontab執行指定用戶的命令時缺少了一些必要的初始化操作,例如用戶語言,用戶主目錄,命令路徑(PATH)等等。我只能確定whoami是輸出正確的(大汗),各位若遇到類似的環境變量初始化問題(不只是wine),大可打開/etc/profile和/etc/profile.d/中看看CentOS究竟會在用戶登陸時做了那些設置。但還有一些變量如HOME、WINEPREFIX未找到初始化的語句,各位如知道請留言。
由於crontab為後台運行,不提供圖形界面,所以如果exe程序帶圖形界面,wine語句前可能必須加上”DISPALY=:0 “
DISPLAY=:0 wine ***.exe >> yourlog.log
PS1:我的CentOS6.5的crontabs版本為1.10-33.el6,Ubuntu 10.04的cron為3.0pl1-106ubuntu5
PS2:當正確設置了HOME而未設置WINEPREFIX時,wine不會報錯。
*