
拜託,我找不到我的命令中的錯誤。
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
。