ในสถานการณ์ที่ผู้ใช้คนเดียวถ้าเราเอาตัวอย่างของxterm
เราก็สามารถนับจำนวนของ PIDs ของxterm
; xterm
สร้าง pid แยกต่างหากสำหรับแต่ละหน้าต่าง
gnome-terminal
อย่างไรก็ตามรัน pid เดียว แต่ข่าวดีก็คือมันสร้างกระบวนการลูกสำหรับแต่ละหน้าต่างและ / หรือแท็บ เราสามารถเรียกกระบวนการลูกเหล่านี้ได้โดยใช้คำสั่ง:
pgrep -P <pid_of_gnome-terminal>
อย่างไรก็ตามมีความยุ่งยากเล็กน้อยในการจัดการกับ:
อ่านคำถามของคุณเราอาจคิดว่าผู้ใช้ในกรณีนี้เป็นจริงเจ้าของ x โดยปกติแล้วเราสามารถใช้$USER
-variable ได้ แต่สิ่งนี้อาจไม่ตรงกับผู้ใช้ที่เข้าสู่ระบบใน$DISPLAY
ปัจจุบัน
ในสถานการณ์ที่ผู้ใช้หลาย PIDs เป็นของ (ทั้งที่) การประยุกต์ใช้ terminal, $DISPLAY
ไม่จำเป็นต้องเป็นของปัจจุบัน เราจำเป็นต้องแยกเฉพาะ pids ที่เกี่ยวข้องและ pids เด็ก
บน Unity (15.10 หรือต่ำกว่า) หากผู้ใช้รายที่สองเข้าสู่ระบบกระบวนการเพิ่มเติมจะเริ่มต้นขึ้น ( gnome-pty-helper
) ซึ่งปรากฏขึ้นเป็นกระบวนการลูกเข้าgnome-terminal
แต่กระบวนการ (ชัด) ไม่มีหน้าต่างหรือแท็บ บนMateกระบวนการอยู่แล้ว
ในระยะสั้น
ในการนับจำนวนแท็บและ / หรือหน้าต่างของแอปพลิเคชันเทอร์มินัลเราจำเป็นต้อง:
- ดูว่าเราใช้แอพพลิเคชั่นเทอร์มินัลที่มีหลาย pids หรือ pid เดียวในหนึ่ง
$DISPLAY
(x-session)
- จากกระบวนการทำงานให้แยกเฉพาะ pids ที่เกี่ยวข้องเท่านั้น
$DISPLAY
- หากแอปพลิเคชันรันกระบวนการลูกสำหรับ pid (สำหรับ windows / แท็บ) ดูว่า
gnome-pty-helper
ทำงานหรือไม่เพื่อแก้ไขหมายเลข
สิ่งนี้สามารถเขียนสคริปต์ได้เป็นอย่างดีอย่างไรก็ตามเพื่อค้นหาจำนวนหน้าต่างและ / หรือแท็บที่เปิดอยู่ในปัจจุบันได้อย่างน่าเชื่อถือ
สคริปต์
ในสคริปต์ดังต่อไปนี้โปรแกรมขั้วกำหนดเป้าหมายจะใช้เป็นข้อโต้แย้ง สคริปต์ทำงานบนเทอร์มินัลมากมายที่ฉันทดสอบ ข้อยกเว้นอยู่Tilda
ในขณะนี้
ตัวอย่าง
- ฉันมีผู้ใช้สองคนเข้าสู่ระบบหนึ่งคน (ไม่ใช่คนปัจจุบัน) ที่มีสอง
gnome-terminal
หน้าต่างหนึ่งคน (หนึ่งคนในรูป) ที่มีสามgnome-terminal
หน้าต่างและสองxterm
หน้าต่าง
คำสั่ง:
/path/to/get_terms.sh gnome-terminal
เอาท์พุท:
3
ในขณะที่
/path/to/get_terms.sh xterm
เอาท์พุท:
2
สคริปต์
#!/bin/bash
terminal=$1
# get the user running the current x-session
username=$(who | grep $DISPLAY | head -1 | awk '{print $1}')
# get the pid of the terminal for the current user
userpid=$(pgrep -u $username $terminal)
# check what type the terminal is (multi pid/single pid)
npids="$(echo "$userpid" | wc -w)"
# in case of a single pid, count the children
if [ "$npids" -eq 1 ]; then
# check if gnome-pty-helper runs (starts when multiple users are logged in)
ptpid=$(pgrep gnome-pty-helpe)
# get number of child- procs
let "orig = $( pgrep -P $(pgrep -u $username $terminal) | wc -w )"
# if pty-helper runs, correct the number of child procs
if [ -n "$ptpid" ] && [ -n "$userpid" ]; then
let "n_terms = $orig-1"; else let "n_terms = $orig"
fi
# if no child procs run, n-terminals = n-counted pids (difference Mate <> Unity)
if [ "$n_terms" -eq 0 ]; then echo $orig; else echo $n_terms; fi
# in case of multiple pids, count the pids
elif [ "$npids" -gt 1 ]; then echo $npids
fi
ใช้
tty
ความคิดที่สวยงามด้วย ฉันเดาว่าเรา / คนอื่นให้ความสนใจกับ "คำถาม" นั้นมากเกินไปและลืมไปว่าอาจมีวิธีแก้ปัญหาอื่น ๆ สำหรับ "ความต้องการ" ทั้งหมด :) ฉันจะเล่นด้วยการใช้ตัวเลือกสีแบบสุ่ม หากเป็น 256 สีการเลือกสีเดียวกัน / สีที่คล้ายกันไม่ควรเกิดขึ้นมาก อย่างไรก็ตามการตั้งค่าสีด้วยตนเองสำหรับหมายเลข pts ที่กำหนดจะให้การตั้งค่าส่วนบุคคลที่ดีขึ้น