Linux 作業系統指令碼格式問題導致指令碼無法執行

清風艾艾發表於2018-08-01

    最近,在做一個mysql的mgr+proxysql的叢集初始化工作。在proxysql部署完成,開啟proxysql的自動探測mysql叢集執行狀態時,proxysql後臺日誌報錯提示:無法執行指令碼,指令碼檔案或路徑不存在,但是透過linux的命令ls -l檢視報錯的檔案路徑是正確的,見了鬼。無奈之下,手工執行指令碼也報錯命令或檔案不存在:-bash: ./gr_sw_mode_checker.sh: /bin/bash^M: bad interpreter: No such file or directory。但是,看到了^M,太熟悉了,vi檢視了下檔案的格式,竟然是dos格式的,然後格式化成unix格式的,proxysql重於能調取到指令碼,簡直要淚奔的感覺。

    問題處理過程記錄如下,以待後查:

    1、proxysql開啟scheduler後,後臺日誌提示調取指令碼失敗

[root@mmgrpro1 proxysql]# tail -f proxysql.log 

2018-08-01 00:17:28 ProxySQL_Admin.cpp:7947:run_once(): [ERROR] Scheduler: Failed to run /var/lib/proxysql/gr_sw_mode_checker.sh

execve(): No such file or directory

2018-08-01 00:17:31 ProxySQL_Admin.cpp:7947:run_once(): [ERROR] Scheduler: Failed to run /var/lib/proxysql/gr_sw_mode_checker.sh

execve(): No such file or directory

2018-08-01 00:17:34 ProxySQL_Admin.cpp:7947:run_once(): [ERROR] Scheduler: Failed to run /var/lib/proxysql/gr_sw_mode_checker.sh

execve(): No such file or directory

    2、linux作業系統層檢視指令碼所在路徑是否存在

[root@mmgrpro1 proxysql]# ls -l /var/lib/proxysql/gr_sw_mode_checker.sh

-rwxr-xr-x 1 mysql mysql 8292 Jul 31 15:47 /var/lib/proxysql/gr_sw_mode_checker.sh

[root@mmgrpro1 proxysql]#

到這,事情陷入僵局,指令碼明明存在,但是proxysql卻說找不到指令碼。在此之前發生過,如果指令碼沒有執行許可權時,

proxysql會報許可權拒絕:

2018-07-31 16:57:39 ProxySQL_Admin.cpp:7947:run_once(): [ERROR] Scheduler: Failed to run /var/lib/proxysql/gr_sw_mode_checker.sh

execve(): Permission denied

2018-07-31 16:57:44 ProxySQL_Admin.cpp:7947:run_once(): [ERROR] Scheduler: Failed to run /var/lib/proxysql/gr_sw_mode_checker.sh

execve(): Permission denied

2018-07-31 16:57:48 MySQL_Monitor.cpp:1362:monitor_ping(): [ERROR] Server 192.168.10.131:3306 missed 3 heartbeats, shunning it and killing all the connections

2018-07-31 16:57:49 ProxySQL_Admin.cpp:7947:run_once(): [ERROR] Scheduler: Failed to run /var/lib/proxysql/gr_sw_mode_checker.sh

execve(): Permission denied

    3、自我反省,將實施方案看了無數變,又對照部署環境檢查了好幾遍,沒發現任何異常,proxysql就是調取指令碼失敗,

實在是無奈呀,自己手工執行指令碼,奇怪的是bash也報檔案不存在:

[root@mmgrpro1 proxysql]# ./gr_sw_mode_checker.sh 

-bash: ./gr_sw_mode_checker.sh: /bin/bash^M : bad interpreter: No such file or directory

[root@mmgrpro1 proxysql]# ls -l /var/lib/proxysql/gr_sw_mode_checker.sh

-rwxr-xr-x 1 mysql mysql 8292 Jul 31 15:47 /var/lib/proxysql/gr_sw_mode_checker.sh

[root@mmgrpro1 proxysql]# 

但是,我看到了熟悉的面孔/bin/bash^M,終於找到了問題的癥結,原本我是從網頁上覆制下來的指令碼程式碼用UE編輯的,

指令碼格式是DOS格式的,在unix或linux平臺上需要轉換成unix格式的。

    4、問題處理,使用vi編輯器,格式化指令碼

--vi 指令碼名稱,輸入shift+:,然後輸入set ff?回車,檢視指令碼格式

--set ff?回車後顯示是dos格式

--vi下,將指令碼從dos轉換成unix,輸入set ff=unix回車,然後wq儲存退出

    5、指令碼儲存後,proxysql調取指令碼成功,雖然還有指令碼相關的異常,但是不報:no such file or directory了

    到此問題解決,問題處理下來,真的不理解歪果仁的思維,明明是指令碼內容有問題,卻丟擲個檔案不存在的異常,讓人費解。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29357786/viewspace-2168891/,如需轉載,請註明出處,否則將追究法律責任。

相關文章