ฆ่าหน้าจอ (แต่ไม่ใช่ทุกหน้าจอ)


19

ฉันมีหลายหน้าจอที่ทำงานบนเซิร์ฟเวอร์ Ubuntu ที่เริ่มต้นเป็น:

screen -dmS screen1 cmd
screen -dmS screen2 cmd
etc...

และฉันต้องฆ่าหน้าจอเดียว แต่ไม่ใช่ทั้งหมด คำสั่งที่ถูกต้องในการฆ่าหน้าจอใดหน้าจอหนึ่งด้วยชื่อของมันคืออะไร? ฉันอ่านหน้า man แล้วแต่ฉันไม่สามารถหาคำสั่งที่ฉันต้องการได้

นอกจากนี้ฉันต้องการเขียนคำสั่งนี้เป็นสคริปต์ทุบตีดังนั้นฉันจึงไม่สามารถscreen -r screen1กดCtrl+ Xตามปกติ


ขออภัยคิดว่านี่เป็นเรื่องเกี่ยวกับ Donkey Kong เป็นครั้งที่สอง
Chopper3

ฉันชอบเสื้อยืดตัวนี้ohgizmo.com/wp-content/uploads/2008/11/…
Chopper3

นั่นคือเสื้อยืดที่ดีคนส่วนใหญ่จะไม่ได้รับมันจนกว่าพวกเขาจะได้เห็น "ราชาแห่งกง": imdb.com/title/tt0923752
BassKozz

คำที่ถูกต้องสำหรับวัตถุของวลีคือ "เจ้า"
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

3
คุณพูดว่า "เข้าใจแล้ว" ที่นี่และ "ขอบคุณ" ด้านล่าง มันควรจะ "เอา [สำหรับ] เจ้า" และ "ขอบคุณ [เป็น] เจ้า"
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

คำตอบ:


19

จากหน้าคน:

   -X   Send the specified command to a running screen  session.  You  can
        use  the  -d or -r option to tell screen to look only for attached
        or detached screen sessions. Note that this command  doesn't  work
        if the session is password protected.

คุณทำได้ :

        screen -X -S <sessionid> kill

เพอร์เฟ !!! ขอบคุณ defraagh, musta พลาดสิ่งนั้นในมนุษย์
BassKozz

เป็นการดีที่จะทราบ :-)
inkaphink

9

หากคุณทำscreen -listคุณจะสังเกตเห็นว่าแต่ละชื่อหน้าจอเริ่มต้นด้วยตัวเลขซึ่งเป็น PID ของหน้าจอ:

 $ screen -list
There are screens on:
        12281.pts-1.jonah       (12/21/2009 07:53:19 PM)        (Attached)
        10455.pts-1.jonah       (12/19/2009 10:55:25 AM)        (Detached)
2 Sockets in /var/run/screen/S-raphink.

จากที่นั่นเพียงส่งสัญญาณ KILL ไปยัง PID ที่เฉพาะเจาะจงนี้:

$ kill 12281

และมันจะฆ่าหน้าจอเฉพาะ


สิ่งนี้จะไม่ทำงานเพราะฉันกำลังเรียกใช้จากสคริปต์ทุบตีและฉันไม่จำเป็นต้องดึง PID ออกจากหน้าจอ - รายการที่ตรงกับหน้าจอที่ถูกต้อง ... คำตอบของ defraagh ด้านบนทำงานได้อย่างมีเสน่ห์ ขอบคุณ
BassKozz

ตกลงดีที่ defraagh มีทางออกที่สมบูรณ์แบบสำหรับมัน
ℝaphink

1

โซลูชันของ defraagh ไม่ได้ผลสำหรับฉัน แต่ฉันสามารถฆ่าเซสชันหน้าจอโดยใช้แนวคิดของ Raphink:

หน้าจอรายการรับ ID กระบวนการ

kill -9 PROCESSID

หน้าจอเช็ด SESSIONID


1

หากคุณมีหลายหน้าจอที่มีชื่อเดียวกันคุณสามารถฆ่าพวกเขาในครั้งเดียว:

screen -ls  | egrep "^\s*[0-9]+.ScreenName" | awk -F "." '{print $1}' | xargs kill
  • คำสั่งscreen -lsพิมพ์หน้าจอพร้อมหมายเลขกระบวนการ ยกตัวอย่างเช่น4773.testเป็นหน้าจอที่มีจำนวนกระบวนการ4773และชื่อการทดสอบ ตัวอย่างผลลัพธ์:

    6322.ss      (05/23/2018 10:39:08 AM)        (Detached)
    6305.sc  (05/23/2018 10:38:40 AM)        (Detached)
    6265.ScreenName       (05/23/2018 10:37:59 AM)        (Detached)
    6249.ScreenName  (05/23/2018 10:37:50 AM)        (Detached)
    6236.scc        (05/23/2018 10:37:42 AM)        (Detached)
  • egrepตัวกรองคำสั่งด้านบนข้อความตัวอย่างที่ส่งผ่านสาย piped | .

  • คำสั่งawk -F "." '{print $1}'แยกคอลัมน์แรกของแต่ละบรรทัด ตัวคั่นระหว่างคอลัมน์ถูกกำหนดเป็นจุด (.)โดยตัวเลือก-F
  • ในที่สุดคำสั่งxargs killจะฆ่ากระบวนการทั้งหมดที่ส่งหมายเลขผ่านไพพ์ | xargsจะใช้เมื่อเราต้องการรันคำสั่งในแต่ละอินพุต


0

ฉันจัดการกับเรื่องนี้ดังนี้:

process=$(screen -ls | grep screen1)
kill $(echo $process | cut -f1 -d'.')
exit

คำอธิบายคือคุณรับผลลัพธ์screen -lsและค้นหาหน้าจอเฉพาะที่คุณสนใจโดยใช้ grep จากนั้นกำหนดสตริงนั้นให้กับตัวแปรprocessแล้วกำหนดสตริงที่ให้กับตัวแปร

ตั้งแต่เอาท์พุทจาก screen -ls PID อยู่เสมอตามด้วยจุดคุณจึงสามารถใช้การตัดเพื่อกำจัดจุดและทุกสิ่งที่อยู่หลังมัน ในตัวอย่างข้างต้นเราใส่มันไว้ในวงเล็บแล้วป้อนไปยังคำสั่ง kill แม้ว่าคุณสามารถทำได้เป็นเชิงเส้นซึ่งอาจรวมถึงการเขียนลงในไฟล์ temp และอ่านจากนั้น

คุณต้องตรวจสอบให้แน่ใจว่าชื่อหน้าจอของคุณไม่ซ้ำกันและ grep นั้นจะส่งคืนชื่อของหน้าจอที่คุณต้องการฆ่าเท่านั้น

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