วิธีแสดงรายการเซสชันที่ใช้งานหน้าจอ


233

screenฉันมีพวงของเซิร์ฟเวอร์ซึ่งผมใช้ทดลองใช้ กระบวนการดังต่อไปนี้:

  1. ssh ไปยังเซิร์ฟเวอร์ XXX
  2. เปิด screen
  3. เริ่มการทดสอบในไม่กี่แท็บ
  4. detach screen
  5. ตัดการเชื่อมต่อจากเซิร์ฟเวอร์

ในขณะที่การทดสอบกำลังทำงานอยู่ฉันสามารถค้นหาได้อย่างง่ายดายว่าเซิร์ฟเวอร์ใดที่ใช้งานเซิร์ฟเวอร์sshทั้งหมดและแสดงรายการกระบวนการทำงานของฉัน (โดยใช้topหรือps)

อย่างไรก็ตามเมื่อการทดสอบเสร็จสิ้นฉันจะค้นหาเซิร์ฟเวอร์ที่ฉันเปิดเซสชันหน้าจอได้อย่างไร (เพื่อให้ฉันสามารถดูผลลัพธ์ออกให้เปิดใหม่อีกครั้ง)

PS: การทดลองของฉันพิมพ์ผลลัพธ์ไปยังไฟล์ด้วย ... แต่นี่ไม่ใช่ประเด็นของคำถามของฉัน

คำตอบ:


420

หากต้องการแสดงเซสชันหน้าจอทั้งหมดสำหรับผู้ใช้ให้รันคำสั่งต่อไปนี้ในฐานะผู้ใช้ดังกล่าว:

screen -ls

หากต้องการดูเซสชันหน้าจอทั้งหมดในเครื่องเฉพาะคุณสามารถทำได้:

ls -laR /var/run/screen/

ฉันได้สิ่งนี้ในเครื่องของฉัน:

gentle ~ # ls -laR /var/run/screen/

/var/run/screen/:
total 1
drwxrwxr-x  4 root utmp   96 Mar  1  2005 .
drwxr-xr-x 10 root root  840 Feb  1 03:10 ..
drwx------  2 josh users  88 Jan 13 11:33 S-josh
drwx------  2 root root   48 Feb 11 10:50 S-root

/var/run/screen/S-josh:
total 0
drwx------ 2 josh users 88 Jan 13 11:33 .
drwxrwxr-x 4 root utmp  96 Mar  1  2005 ..
prwx------ 1 josh users  0 Feb 11 10:41 12931.pts-0.gentle

/var/run/screen/S-root:
total 0
drwx------ 2 root root 48 Feb 11 10:50 .
drwxrwxr-x 4 root utmp 96 Mar  1  2005 ..

นี่เป็นการใช้ Unix Sockets ที่ยอดเยี่ยมใน Unix Sockets ซึ่งห่อหุ้มไว้ในสิทธิ์ระบบไฟล์เพื่อจัดการกับความปลอดภัยสถานะและสตรีม


1
ผมสงสัยว่าทำไมคำตอบนี้หนึ่งที่ตอบคำถามได้อย่างสมบูรณ์แบบได้แล้ว ... downvote
Blaszard

หรือหากคุณต้องการรับหน้าจอเฉพาะตามหลักการตั้งชื่อคุณสามารถ grep ผลลัพธ์ ls -R /var/run/screen/S-root/ | grep "NamingConvention". หน้าจอบันทึกใน<pid>.<screen_name>รูปแบบ สิ่งนี้มีประโยชน์สำหรับสคริปต์ทุบตี ดังนั้นหากคุณมีหน้าจอที่มีชื่อ0000.NamingConventionมันก็แค่คืนชื่อของหน้าจอที่คุณกำลังมองหาในรูปแบบที่ง่ายต่อการแยกวิเคราะห์
Elias Ranz


13

ในขณะที่คำตอบของ joshperry ถูกต้องฉันพบว่าน่ารำคาญมากที่ไม่ได้บอกชื่อหน้าจอ (ที่คุณตั้งค่าด้วยตัวเลือก -t) ซึ่งเป็นสิ่งที่คุณใช้เพื่อระบุเซสชัน (ไม่ใช่ความผิดของเขาแน่นอนมันเป็นข้อบกพร่องของหน้าจอ)

นั่นเป็นเหตุผลที่ฉันใช้สคริปต์เช่นนี้แทน: ps auxw|grep -i screen|grep -v grep


2
ลองดูที่ตัวเลือก -S ค่าที่ให้ไว้จะถูกเก็บไว้ในชื่อไฟล์ซ็อกเก็ตยูนิกซ์และสามารถมองเห็นได้ในlsผลลัพธ์ หากคุณต้องการคุณสามารถใช้ตัวเลือก -t เช่นกัน
joshperry

ตัวเลือก -S นั้นยอดเยี่ยมเนื่องจากช่วยให้คุณสามารถดำเนินการต่อด้วยชื่อเซสชันนั้น:screen -rd <sessionname>
jorisw

7

ฉันไม่แน่ใจคำถามของคุณจริง ๆ แต่ถ้าทั้งหมดที่คุณต้องการคือรายการเซสชันที่เปิดอยู่ในขณะนี้ลอง:

screen -ls

6
 For windows system

 Open putty 
 then login in server

หากคุณต้องการที่จะเห็นหน้าจอในคอนโซลจากนั้นคุณต้องเขียนคำสั่ง

 Screen -ls

ถ้าคุณต้องเข้าถึงหน้าจอคุณต้องใช้คำสั่งด้านล่าง

 screen -x screen id

เขียนPWDในบรรทัดคำสั่งเพื่อตรวจสอบโฟลเดอร์ที่คุณอยู่ในขณะนี้


3

ในกรณีส่วนใหญ่screen -RRx $username/จะพอเพียง :)

หากคุณยังต้องการแสดงรายการทุกหน้าจอให้วางสคริปต์ต่อไปนี้ในเส้นทางของคุณแล้วเรียกมันว่าหน้าจอหรืออะไรก็ได้ที่คุณต้องการ:

#!/bin/bash
if [[ "$1" != "-ls-all" ]]; then
    exec /usr/bin/screen "$@"
else
    shopt -s nullglob
    screens=(/var/run/screen/S-*/*)
    if (( ${#screens[@]} == 0 )); then
        echo "no screen session found in /var/run/screen"
    else
        echo "${screens[@]#*S-}"
    fi
fi

มันจะทำงานเหมือนกับหน้าจอยกเว้นการแสดงเซสชันหน้าจอทั้งหมดเมื่อให้ตัวเลือก -ls-all เป็นพารามิเตอร์แรก


3

หลายคนชี้ให้เห็นแล้วว่า

$ screen -ls

จะแสดงรายการเซสชันหน้าจอ

นี่คือเคล็ดลับอื่นที่อาจเป็นประโยชน์กับคุณ

หากคุณเพิ่มคำสั่งต่อไปนี้เป็นบรรทัดสุดท้ายในไฟล์. bashrcของคุณ บนเซิร์ฟเวอร์ xxx คำสั่งนั้นจะเชื่อมต่อกับเซสชันหน้าจอของคุณอีกครั้งโดยอัตโนมัติเมื่อเข้าสู่ระบบ

screen -d -r

หวังว่าคุณจะพบว่ามีประโยชน์


1
ฉันต้องการที่จะทราบว่าคุณจะต้องเข้าสู่ระบบในฐานะผู้ใช้เดียวกันกับที่เริ่มหน้าจอฉันกังวลว่าเซสชั่นหน้าจอของฉันหายไป แต่การคัดลอกไฟล์ของฉันดำเนินการภายใต้ผู้ใช้ "สื่อ" มันอาจฟังดูสมเหตุสมผล แต่มันอาจช่วยลดความตื่นตระหนกได้ถ้าคุณดูแลมัน
Paul

0

ps x | หน้าจอ grep

เพื่อดูว่าหน้าจอนั้นกำลังทำงานอะไรในกรณีที่คุณใช้คำสั่ง

หน้าจอ -A -m -d php make_something.php


-4

ดังนั้นคุณใช้หน้าจอเพื่อให้การทดสอบทำงานในพื้นหลังหรืออะไร ถ้าเป็นเช่นนั้นทำไมไม่เพียง แต่เริ่มมันในพื้นหลัง?

./experiment &

และถ้าคุณถามว่าจะรับการแจ้งเตือนงานที่ฉันทำไปได้แล้วจะลองวิธีทดสอบการทำงานร่วมกับคำสั่งอีเมลได้อย่างไร

./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"

ฉันกำลังใช้หน้าจอเพื่อให้ฉันสามารถตัดการเชื่อมต่อจากเซิร์ฟเวอร์โดยไม่ต้องยุติการทดลองของฉัน คำถามไม่ใช่วิธีการรับการแจ้งเตือน (แม้ว่าอีเมลอาจเป็นวิธีที่ดีในการทำ) แต่จะค้นหาได้อย่างไรว่าเครื่องที่กำหนดมีเซสชันเปิดหน้าจอหรือไม่ ขอบคุณสำหรับคำตอบของคุณ!
Wookai

ฉันไม่ใช่ผู้ดูแลระบบที่มีประสบการณ์ แต่ฉันพบว่าการใช้หน้าจอเพื่อเรียกใช้กระบวนการเซิร์ฟเวอร์ทำงานได้ดี: หากมีบางอย่างผิดปกติคุณสามารถปัดไปที่หน้าต่างนั้นและดูผลลัพธ์ทั้งหมดที่นำไปสู่ปัญหา - คุณไม่จำเป็นต้อง เริ่มเปิดไฟล์บันทึก นอกจากนี้ยังหมายความว่าคุณสามารถฆ่ากระบวนการด้วย ctrl + c ได้อย่างง่ายดาย ทั้งหมดนี้มีประโยชน์หากคุณเริ่มและปิดบริการเดียวกันบ่อยครั้ง
Steve Bennett
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.