Script shell ได้รับรหัสและกระบวนการฆ่า


0

ได้โปรดฉันไม่พบข้อผิดพลาดในคำสั่งของฉัน

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

คุณมีความคิดหรือไม่?


รูปแบบ awk นั้นแตกต่างกัน แทนที่จะใช้ awk {print $ 2} ให้ใช้ awk '{print $ 2}' คุณต้องปรับโครงสร้างรหัสของคุณใหม่
Romeo Ninov

@RomeoNinov ไม่สามารถใช้งานได้โดยตรงเนื่องจาก OP ใช้''ในการอ้างps -efคำสั่งและไปป์แล้ว
CVn

@ MichaelKjörlingใช่ แต่ awk จะไม่ทำงาน (ในตัวอย่างด้านบน) ด้วย ดังนั้นในขณะที่ฉันพูดถึงเขา / เธอควรเขียนรหัส :)
โรมิโอ Ninov

@RomeoNinov: ข้อผิดพลาดเดียวกัน "awk: บรรทัด 2: หายไป} ใกล้ถึงจุดสิ้นสุดของไฟล์"
นักวิจัย

@researcher ตรวจสอบความคิดเห็นข้างต้นและแทนที่ awk ด้วยการตัดตัวอย่างเช่น: unix.stackexchange.com/questions/65932/…
Romeo Ninov

คำตอบ:


1

สำหรับปัญหาประเภทนี้มักจะดีที่สุดที่จะเริ่มต้นโดยแบ่งเป็นส่วนที่เป็นส่วนประกอบ เริ่มต้นด้วยนิพจน์ด้านในสุดซึ่งดูเหมือนว่ามีจุดมุ่งหมายเพื่อให้ได้รับ PID ทั้งหมดmyprocessเพื่อส่งสัญญาณและดำเนินการออกไปข้างนอกทดสอบแต่ละขั้นตอนเพื่อให้แน่ใจว่ามันจะให้ผลลัพธ์ที่คุณคาดหวัง

คุณกำลังทำสิ่งนี้โดยการเอาท์พุทของpsgrepping สำหรับกระบวนการรันเอาต์พุตผ่านawkเพื่อแยก PID ที่เกี่ยวข้องจากนั้นส่งผ่านไปยัง xargs โดยการดูว่าคุณพยายามทำอะไรจริง ๆมากกว่าปัญหาเฉพาะที่คุณกำลังเผชิญอยู่ฉันสามารถบอกได้ว่ามีวิธีที่ดีกว่าอย่างน้อยสองวิธีในการทำเช่นนี้ซึ่งบังเอิญหลีกเลี่ยงปัญหาที่คุณกำลังเผชิญอยู่ ในการมีจำนวนชั้นของข้อความในคำสั่งผสมเดียว)


หนึ่งคือการรักษาpsและใช้-Cและ-oพารามิเตอร์เพื่อรับข้อมูลที่คุณสนใจเท่านั้นนี่คือตัวอย่างในหน้า man (1) ps จากนั้นคุณจะต้องการ:

ps -C myprocess -o pid=

ซึ่งจะพิมพ์เฉพาะ PID (s) ของกระบวนการใด ๆ myprocessที่มีชื่อภาพ สิ่งนี้จะถูกส่งไปยัง xargs แทนของคุณps ... | xargs killด้วย:

ps -C myprocess -o pid= | xargs kill

หรืออาจใช้การทดแทนกระบวนการเพื่อหลีกเลี่ยง pipe และ xargs ทั้งหมด:

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

ทางเลือกที่ดียิ่งขึ้นคือการใช้killallในการส่งสัญญาณกระบวนการทั้งหมดที่มีชื่อภาพที่ได้รับโดยตรง

killall -e myprocess

ที่นี่-eระบุโหมด "แน่นอน" ซึ่งภาพของกระบวนการตรงกันมาก ในกรณีนี้แทนที่ของคุณps ... | xargs killทั้งหมดด้วยข้างต้น


-o UserKnownHostsFile=/dev/nul

โอ้และชื่อทั่วไปคือ / dev / null ไม่ใช่ / dev / nul NULคือ CP / M-ism จากกลางทศวรรษ 1970 โดย Microsoft ส่งต่อไปยัง Windows รุ่นปัจจุบัน ในกรณีนี้โดยเฉพาะอย่างยิ่งผลกระทบที่อาจจะหรืออาจจะไม่เหมือนกันขึ้นอยู่กับวิธีที่เข้มงวดของคุณsshคือ

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