最近在公司項目中遇到一個腳本調用問題,有個python的命令行工具使用subprocess模塊啟動了一個zookeeper的shell腳本,在執行過程中報了一個錯:OSError: [Errno 8] Exec format error,如下圖:
此時我嘗試在命令行執行紅框中的shell腳本:執行成功,說明不是shell腳本的問題。
然后,我懷疑是python的權限有問題,網上查了下,說是要加上python解釋器(#!/usr/env/python),於是我就檢查了下對應的python文件內容:確認已包含#!/usr/env/python。
接着我又擔心是執行權限的問題,於是修改了python和shell腳本的可執行權限:但是還是沒有解決問題
chmod +x XXX.py chmod +x /etc/init.d/zookeeper
最后,我懷疑是shell腳本的解釋器有問題,此時我打開shell腳本(/etc/init.d/zookeeper),發現最上面沒有#!/bin/sh
我們知道,shell腳本有兩種執行方式:
1. sh XXX.sh
2. chmod +XXX.sh; ./XXX.sh
對於第二種運行方式,腳本里面必須包含shell解釋器。
如下圖,我添加了shell解釋器(#!/bin/sh)后,python腳本調用shell腳本不報錯了。
至此問題得到了解決。
總結本次調試過程,一共分為三步:
1.手動執行shell腳本:看腳本是否本身運行就有問題,先不考慮python調用shell的問題。
2.檢查可執行權限:shell和python腳本均要保證該用戶有可執行權限,不放心的話,就chmod +x 對應的腳本。
3.檢查腳本的解釋器:因為腳本是解釋型語言(需要指定解釋器才能逐行執行),不是編譯型語言(編譯好之后不需要逐行翻譯解釋),如果沒有解釋器很可能會導致腳本不可執行。
博主:測試生財(一個不為996而996的測開碼農)
座右銘:專注測試開發與自動化運維,努力讀書思考寫作,為內卷的人生奠定財務自由。
內容范疇:技術提升,職場雜談,事業發展,閱讀寫作,投資理財,健康人生。
csdn:https://blog.csdn.net/ccgshigao
博客園:https://www.cnblogs.com/qa-freeroad/
51cto:https://blog.51cto.com/14900374
微信公眾號:測試生財(定期分享獨家內容和資源)