前言
那些所謂的坑, 一大半都是欠下的技術(shù)債, 遲早是要還的. -- 雨夜狂奔的蝸牛
背景
前后3人零零散散大約耗時3小時, 發(fā)現(xiàn)問題原來不過是rc.local的一個特性, 所謂優(yōu)秀的工程師和普通的工程師的效率可以相差百倍, 這個時候感觸是最深的, 雖然之前也一直在定位問題, 但直到現(xiàn)在才慢慢開始意識到定位問題在平常工作中所耗費的時間. 雖然問題算不上高大上, 甚至有點low, 記錄下來一來是記錄自己的成長過程, 二來也算是對自己的一種鞭策, 下次再遇到類似的問題, 能不能高效定位出問題的關(guān)鍵所在?
結(jié)論
使用rc.local時要將自己的命令等放到exit 0前
過程
下午代碼寫的正起勁, 忽然身后的小h讓我查看一個問題, 說是在裝機的過程當(dāng)中物理機設(shè)備發(fā)現(xiàn)不了了, 但是同樣的環(huán)境, 同樣的腳本在另外一個產(chǎn)品線卻是好的. 這一下子就激起了我的好奇心.
按照以往的思路當(dāng)然是先重現(xiàn)問題,然后才有思路看如何解決問題嘛.
一開始盡然沒復(fù)現(xiàn), 開始讓我懷疑是不是復(fù)現(xiàn)用的虛擬機網(wǎng)卡太少了,網(wǎng)絡(luò)接口啟動以及IP獲取太快導(dǎo)致問題沒有復(fù)現(xiàn). 然而當(dāng)我再仔細對比兩處的rc.local文件時才發(fā)現(xiàn)測試用的虛擬機上面少復(fù)制了最關(guān)鍵的一行
加上之后, 復(fù)現(xiàn)了!!! 突然間自己也激動起來了, 只要能復(fù)現(xiàn)的問題就不是什么大問題.
然后分別進行了以下嘗試
- 增加日志打印
- 懷疑跟網(wǎng)絡(luò)相關(guān)->改腳本為啟動一個HTTP server
- 改腳本為一般腳本,僅僅打印hello world
- 改為shell
經(jīng)歷了以上方法的折騰陷入了短暫的無思路狀態(tài)
回想到/var/log/message里面同一時刻的網(wǎng)絡(luò)接口啟動報錯, 突然靈光一閃, 大膽猜測, 是否跟網(wǎng)絡(luò)接口啟動失敗有關(guān)? 網(wǎng)絡(luò)接口啟動失敗退出碼非0導(dǎo)致rc.local失效? 但后迅速驗證, 改systemctl restart network為exit 1, 問題復(fù)現(xiàn), 驗證了心中的猜測, 然后再將exit 1改為exit 0重復(fù)驗證猜測, 啟動成功, 這下基本可以確認問題所在了, 然后又去Google了一把發(fā)現(xiàn)一堆講使用rc.local時要將自己的命令放在exit 0之前, 但是就是沒有找到為什么要這么做的原因, 或者說rc.local的退出碼最終是由誰來處理并沒有講清楚, 待解惑.
參考
https://www.freebsd.org/cgi/man.cgi?query=rc.local&sektion=8