我想運行一個簡單的 bash 腳本(下面稱為killprocess.sh)來終止遠端電腦上特定連接埠(例如 8080)中運行的特定進程/服務,其中兩台電腦都具有 Ubuntu 18.04.1 LTS 作業系統。
我透過 ssh (openssh) 建立了連接,如下所示來執行腳本。連結也建立成功。
sshpass -p "password" ssh -n [email protected] -f "/bin/bash /home/killprocess.sh"
下面給出了killprocess.sh的內容。
processID=$(lsof -t -i:8080)
echo $processID
kill $processID
儘管它在控制台上正確列印了進程 ID,但它在下面給出了錯誤訊息,暗示無法殺死它。
:參數必須是進程或作業 ID
答案1
運行fromdos killprocess.sh
命令以使您的腳本正常工作(它包含在tofrodos
包中)。
這就是原因。
該錯誤訊息表明您已經在 Windows 文字編輯器中編寫了腳本,該編輯器以不同的方式處理行結尾(添加\r\n
到行尾而不是僅添加到行尾\n
)。該錯誤訊息值得懷疑,因為它應該類似於
bash: kill: meh: arguments must be process or job IDs
kill
只有當命令的參數包含\r
(回車)字元時,它才會輸出您提到的一行。因此,當列印錯誤訊息時,在第三個冒號之前,遊標跳回行首,並且錯誤訊息的其餘部分將覆蓋迄今為止列印的任何內容。這也解釋了為什麼該kill
命令會抱怨:它收到了類似 的內容1234\r
,它不能是進程 ID。
這很可能是因為你的腳本的第一行實際上是
processID=$(lsof -t -i:8080)\r
但你當然看不到這個\r
字符,因為它是非打印字符。您在第二行的輸出中看不到它,因為它輸出該行,遊標跳回開頭,但隨後換行符號導致遊標轉到下一行。
順便說一句,如果 bash 錯誤訊息以冒號開頭,則始終會懷疑 unix/windows 行結束問題。