ฆ่ากระบวนการตามส่วนต่าง ๆ ของชื่อบน ssh (ผลลัพธ์ที่แตกต่างเมื่อรันเซสชัน ssh แบบโต้ตอบ)


2

ฉันพยายามทำ:

นิดหน่อย pid ของกระบวนการตามสิ่งที่ฉัน grep สำหรับให้พูดว่า "ชื่อ":

pid=(ps aux | grep '[Ń]ame' | awk '{print $2}' | head -1)

จากนั้นฆ่ามัน

kill $pid

มันใช้งานได้ดีถ้าฉันเข้าสู่เครื่องด้วย ssh แต่ฉันต้องการทำจากสคริปต์ และมันก็ไม่ทำงาน:

ssh hostname "pid=\$(ps aux | grep '[N]ame' | awk '{print $2}' | head -1); echo \$pid"
root 11203 1.5 0.8 6961292 135420 pts/0 Sl 16:52 0:04 java -XX:PermSize=256m -XX:MaxPermSize=512m -Dproperties....

ฉันต้องการทราบวิธีการทำเช่นนี้และทำไมผลลัพธ์จึงแตกต่างกันเมื่อทำตามคำสั่งดังเช่นกรณีหลัง

คำตอบ:


1

คุณสามารถใช้ pgrep เพื่อทำให้การค้นหาง่ายขึ้นและไพพ์ผลลัพธ์ด้วย xargs เพื่อลบการใช้ vars เช่น:

ssh hostname "pgrep emacs | head -1 | xargs echo"

ปัญหาหลักของคุณคือการทุบตีพยายามประเมิน $ 2 ในคำสั่ง ssh ผลลัพธ์เป็นช่องว่างดังนั้นตีความว่าคุณต้องการไพพ์ `awk '{print}' แทน นอกจากนี้คุณยังสามารถลองรันด้วยอักขระ escape อื่น:

ssh hostname "pid=\$(ps aux | grep '[N]ame' | awk '{print \$2}' | head -1); echo \$pid"

เวอร์ชันนั้นใช้งานได้


1

killallมี-rตัวเลือกเพื่อให้ตรงกับชื่อกระบวนการในการแสดงออกปกติ

-r, - regexp ตีความรูปแบบชื่อกระบวนการเป็นนิพจน์ปกติที่ขยาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.