腳本 shell 取得 id 並終止進程

腳本 shell 取得 id 並終止進程

拜託,我找不到我的命令中的錯誤。

ssh -t root@$machine -x "sshpass -p 'ubuntu' ssh -t root@$address -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/nul -x 'ps -ef | grep "myprocess" | awk {print $2} | xargs kill'"

我有這個錯誤:

awk: line 2: missing } near end of file

你有主意嗎?

答案1

對於此類問題,通常最好從將其分解成其組成部分。從最裡面的表達式開始,它似乎旨在獲取所有 PID,myprocess以便向它們發出信號,然後向外工作,測試沿途的每個步驟,以確保它給出您期望的輸出。

您可以透過取得 的輸出ps、grep 進程、運行輸出來awk提取相關的 PID,然後將其傳遞給 xargs 來完成此操作。透過觀察你的實際情況試圖完成我可以告訴你,而不是你面臨的具體問題至少有兩種更好的方法可以做到這一點,巧合的是,這也完全避免了您面臨的問題(這是基於在單一複合命令中存在多層引用)。


一種是保留ps並使用其-C-o參數來僅獲取您感興趣的資訊。然後你會想要:

ps -C myprocess -o pid=

它將僅列印具有影像名稱的任何進程的 PID myprocess。然後可以輕鬆地將其透過管道傳輸到 xargs 中,將您替換ps ... | xargs kill為:

ps -C myprocess -o pid= | xargs kill

或者可能使用進程替換來完全避免管道和 xargs:

kill $( ps -C myprocess -o pid= )

更好的選擇是用來killall直接用給定的圖像名稱向所有進程發出信號:

killall -e myprocess

此處,-e指定“精確”模式,其中過程映像名稱非常匹配。在這種情況下,請將您的內容ps ... | xargs kill完全替換為上述內容。


-o UserKnownHostsFile=/dev/nul

哦,常規名稱是 /dev/null,而不是 /dev/nul。NUL是 20 世紀 70 年代中期的 CP/M 主義,由 Microsoft 延續到當前版本的 Windows 中。在這種特殊情況下,效果可能相同也可能不同,這取決於您的嚴格程度ssh

相關內容