ค้นหาคำสั่งที่ทำงานอยู่ในเซสชันของหน้าจอ


10

ฉันมักจะออกจากงานที่ทำงานอยู่ในหน้าจอเพื่อให้ฉันสามารถตรวจสอบพวกเขาในภายหลัง แต่บางครั้งฉันจำเป็นต้องตรวจสอบคำสั่งที่ทำงานอยู่ภายในหน้าจอ มันมักจะเป็นสคริปต์ประเภท PHP เช่น

screen -d -m nice -n -10 php -f convertThread.php start=10000

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

ฉันไม่เห็นตัวเลือกใด ๆ สำหรับสิ่งนี้ภายในหน้าช่วยเหลือของหน้าจอ

คำตอบ:


18

ฉันเพิ่งจะทำเช่นนี้ บนกองมากเกินผมตอบวิธีการหา PID ของกระบวนการที่ทำงานอยู่ในหน้าจอ เมื่อคุณมี PID คุณสามารถใช้psคำสั่ง นี่คือเนื้อหาของคำตอบนั้นพร้อมเนื้อหาเพิ่มเติมบางส่วนเพื่อแก้ไขสถานการณ์ของคุณ:

คุณสามารถรับ PID ของหน้าจอที่นี่ได้เช่น:

$ screen -ls
There are screens on:
        1934.foo_Server         (01/25/15 15:26:01)     (Detached)
        1876.foo_Webserver      (01/25/15 15:25:37)     (Detached)
        1814.foo_Monitor        (01/25/15 15:25:13)     (Detached)
3 Sockets in /var/run/screen/S-ubuntu.

ให้เราสมมติว่าคุณต้องการให้ PID ของโปรแกรมทำงานใน Bash ในfoo_Monitorเซสชันหน้าจอ ใช้ PID ของfoo_Monitorเซสชันหน้าจอเพื่อรับ PID ของbashเซสชันที่ใช้งานอยู่โดยค้นหา PPID (Parent PID) สำหรับ PID ที่รู้จัก:

$ ps -el | grep 1814 | grep bash
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  1815  1814  0  80   0 -  5520 wait   pts/1    00:00:00 bash

ตอนนี้รับค่า PID ของbashเซสชั่น:

$ ps -el | grep 1814 | grep bash | awk '{print $4}'
1815

ตอนนี้เราต้องการกระบวนการที่มีที่ PID เพียงซ้อนคำสั่งและในเวลานี้ใช้การ-vตั้งค่าสถานะgrep bashเพื่อรับกระบวนการที่ไม่ได้ถูกทุบตี:

$ echo $(ps -el | grep $(ps -el | grep 1814 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
23869

เราสามารถใช้ PID นั้นเพื่อค้นหาคำสั่ง (ดูที่ท้ายบรรทัดที่สอง):

$ ps u -p 23869
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dotanco+ 18345 12.1 20.1 5258484 3307860 ?     Sl   Feb02 1147:09 /usr/lib/foo

รวมทุกอย่างเข้าด้วยกัน:

$ ps u -p $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')

โอ้ฉลาด! ฉันชอบมัน! ตั้งแต่นี้ตอบคำถามโดยตรงฉันจะยอมรับคำตอบนี้ ฉันรู้สึกทราบซึ้ง! ขออภัย @Ghanima (: '
Austin Burk

7

สิ่งที่เกี่ยวกับการใช้screen -S <your-fancy-name>เพื่อให้ช่วงหน้าจอชื่อที่มีความหมายตามคำสั่งที่พวกเขาทำงาน? ชื่อจะได้รับการจดทะเบียนที่มีและถูกนำมาใช้เพื่อดำเนินการต่อโดยเซสชั่นscreen -lsscreen -r <your-fancy-name>

แก้ไขเพื่อเพิ่ม:

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

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