問題
有這樣一個定時任務
1 */12 * * * kinit -kt xxxxxx.keytab principle
這樣寫每天 12點,執行一次。
但是服務器的應用程序報錯:
GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
分析
klist 卻發現keytab過期。
手動執行 kinit -kt xxxxxx.keytab 【principle】 卻沒有問題,有效期得到延長。
查閱kinit手冊卻發現:
-c 這個參數,是指定cache file name的。
如果不指定,則讀取環境變量:KRB5CCNAME 這個變量,如果變量還是不存在,則會使用缺省值:
/tmp/krb5cc_%uid
結論
那么結論來了,正確的寫法應該是
kinit -kt xxxxxx.keytab -c FILE:/path/to/krb5cache/%uid/krb5cc_%uid 【pinciple】
所以根本不是crontab的問題。
思考
此問題通常發生在有多個用戶,使用不同的keytab進行認證的情況。
那么還有一種思路,我們可以 將KRB5CCNAME 寫入 當前用戶的/home/%user/.bashrc
中,並且在crontab表達式前面增加:
source ~/.bashrc && kinit -kt xxxxxx.keytab【pinciple】