วิธีการตรวจสอบจำนวนขั้วที่เปิดโดยผู้ใช้


9

ฉันใช้ Ubuntu และสามารถเปลี่ยนbashสีของshell prompt เป็นสีเขียวได้ด้วยตนเอง

export PS1="\e[0;32m[\u@\h \W]\$ \e[m" 

อย่างไรก็ตามฉันต้องการให้เชลล์พรอมต์สีเปลี่ยนโดยอัตโนมัติทุกครั้งที่ฉันเปิดเทอร์มินัลหรือแท็บใหม่ ฉันทราบว่า Tty พื้นฐานระยะเวลามี 16 สีและมันก็โอเคที่จะหมุนสีถ้ามากกว่า 16 ขั้วเปิด จะแก้ปัญหายังทำงานเมื่อฉันเชื่อมต่อผ่านPutty, หรือtmuxscreen

ความคิดของฉันคือการเขียนสคริปต์เปลือกและวางไว้ใน.bashrcที่ตรวจจับขั้วเซสชั่นใหม่ที่ผู้ใช้มีการเปิดและเพิ่มเคาน์เตอร์ระดับโลกจากการ\e[0;31m[ \e[0;47m[วิธีการตรวจสอบจำนวนขั้วที่เปิดโดยผู้ใช้?

คำตอบ:


8

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

หลีกเลี่ยงการพึ่งพาwhoผลลัพธ์และค้นหาgnome-pty-helperกระบวนการเนื่องจากสิ่งเหล่านี้ใช้ไม่ได้กับgnome-terminalเวอร์ชันที่ใหม่กว่า

โปรดทราบว่าในปัจจุบันกราฟิกเทอร์มินัลจำลองทั้งหมด (รวมถึงผงสำหรับอุดรู) และมัลติเพล็กเซอร์ (หน้าจอ, tmux) รองรับ 256 สี คุณจะได้รับพรอมต์สีที่ดีมากถ้าคุณใช้จานสีนี้

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


1
ttyความคิดที่สวยงามด้วย ฉันเดาว่าเรา / คนอื่นให้ความสนใจกับ "คำถาม" นั้นมากเกินไปและลืมไปว่าอาจมีวิธีแก้ปัญหาอื่น ๆ สำหรับ "ความต้องการ" ทั้งหมด :) ฉันจะเล่นด้วยการใช้ตัวเลือกสีแบบสุ่ม หากเป็น 256 สีการเลือกสีเดียวกัน / สีที่คล้ายกันไม่ควรเกิดขึ้นมาก อย่างไรก็ตามการตั้งค่าสีด้วยตนเองสำหรับหมายเลข pts ที่กำหนดจะให้การตั้งค่าส่วนบุคคลที่ดีขึ้น
GreggD

@TedM ใช่คำถามนั้นค่อนข้างเป็นคำพูดคำถาม XY ตามแนวของ: "ฉันต้องการมีสีที่แตกต่างกันในแต่ละเทอร์มินัลดังนั้นบอกฉัน: ฉันจะนับจำนวนเทอร์มินัลได้อย่างไร"
egmont

@TedM การสุ่มก็เป็นความคิดที่ดีเช่นกัน! (คุณสมบัติหนึ่งของการทำแผนที่แบบกำหนดค่าได้คือหลังจากที่ sudoing ผู้ใช้ใหม่อาจตั้งค่าสีพรอมต์เดียวกันได้อย่างง่ายดายสิ่งนี้อาจหรืออาจไม่ใช่สิ่งที่ผู้ถามดั้งเดิมต้องการมี)
egmont

1
Randomizer ค่อนข้างง่าย: color="\e[38;5;"$(((RANDOM % 231 )+1))"m"(เพียงแค่ 231 คนที่ปฏิเสธเฉดสีเทา) อย่างไรก็ตามสีเหล่านั้นมีสีต่างกันและมีสองเฉดสีที่มืดดังนั้นอาจจะมองไม่เห็นและฉันเกือบจะไม่มีใครใช้มันในชีวิตจริง ...
GreggD

เราไม่รู้เวอร์ชั่น Ubuntu ของผู้ถาม ใน 16.04 ไม่มี gnome-pty-helper อีกต่อไป ( git.gnome.org/browse/vte/commit/?id=299c700 ) ฉันจะไม่ปรับลดรุ่นเพื่อตรวจสอบลำดับชั้นกระบวนการที่แน่นอนในรุ่นที่เก่ากว่า ฉันรู้ว่ามันเคยมีขั้นตอนดังกล่าวฉันแค่ไม่แน่ใจว่าลักษณะลำดับชั้นของพ่อแม่และลูกเป็นอย่างไร โดยวิธีการที่ฉันใช้ความคิดของเด็กนับกระบวนการจากการตอบสนองเดิมของคุณดังนั้นฉันไม่เข้าใจว่า "(โดยคุณ)" ไม่เป็นไร
egmont

5

ในสถานการณ์ที่ผู้ใช้คนเดียวถ้าเราเอาตัวอย่างของ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

ใช้

  • คัดลอกสคริปต์ลงในไฟล์ว่างเปล่าบันทึกเป็นget_terms.shทำให้สามารถเรียกใช้งานได้และรันโดยคำสั่ง:

    /path/to/get_terms.sh <terminal_application>

ที่นี่ฉันมักจะมีหนึ่งการgnome-pty-helperทำงานแม้ว่าจะมีผู้ใช้เพียงคนเดียวที่เข้าสู่ระบบ (ทันทีหลังจากรีบูต) และเมื่อฉันเปิดเทอร์มินัลจำนวนเท่าใดก็จะทำงานที่สองผู้ช่วยเดียวกัน สคริปต์ใหม่ของคุณดูเหมือนจะทำงานกับ mate-terminal (ไม่สามารถทำให้เกิดสิ่งที่เป็นศูนย์) แต่ด้วย xterm เมื่อฉันเปิดเพียง 1 รายการมันจะแสดง0และเริ่มแสดงตัวเลขที่ดีหลังจากหนึ่งวินาทีและกับ gnome-terminal มันมักจะแสดงให้เห็นน้อยเกินไป (ส่งออก0เมื่อเปิดเพียงครั้งเดียวเท่านั้น)
GreggD

@TedM ขอขอบคุณข้อมูลที่เป็นประโยชน์ได้รับการแก้ไขแล้ว
Jacob Vlijm

ฉันชื่นชม "ตัณหา" ของคุณจริงๆ :) ... แต่ก็ยังมีปัญหากับคำพังเพย หนึ่งให้ 1, สองให้ 1, สามให้ 2, สี่ให้ 3, ฯลฯ .. บวกกับการค้นพบใหม่ของฉัน, "Tilda" ของ MATE (ที่หนึ่งขั้วพิเศษ "ไม่ทราบ" ขั้วในคำตอบของฉัน) ยังมีปัญหาเช่นเดียวกับคำพังเพย ด้วยแท็บของมัน xterm และ mate-terminal ดูเหมือนว่าจะทำงานได้ดี
GreggD

@TedM ขอบคุณที่พูดถึง! คำถามงี่เง่า แต่คุณแน่ใจหรือว่าคุณใช้รหัสล่าสุด? ใน Mate 15.10 การทดสอบทั้งหมดฉันทำงานโดยไม่มีข้อยกเว้น รุ่น Mate ของคุณคืออะไร? ในความสามัคคีทุกอย่างทำงานได้ดี
Jacob Vlijm

@TedM ที่ว่างเปล่าสวย ๆ ของฉันด้วย 15.10 Mate มันก็เป็นค่าเริ่มต้นด้วย เพียงแค่ทำการทดสอบอีกครั้งอย่างสมบูรณ์แบบ! ฉันขอพรุ่งนี้ได้ไหมเพื่อเรียกใช้สคริปต์ที่แก้ไขแล้วและโพสต์ผลลัพธ์ที่อื่นเพื่อดูว่าอะไรทำให้เกิดข้อยกเว้นในกรณีของคุณ?
Jacob Vlijm

1

awkวิธี:

who | awk 'BEGIN{count=0}{ if(NR!=1){count++} }END{print count}'

คำอธิบาย:

ในคำสั่งซับด้านบน 1 awkใช้เพื่อค้นหาจำนวนเทอร์มินัล ภายในawkโปรแกรมมันแค่ตรวจสอบจำนวนบรรทัดที่ส่งคืนโดย who command - 1


สิ่งนี้จะคืนค่า 0 ให้ฉันซึ่งไม่เป็นความจริงอย่างชัดเจน ...
Zanna

อันนี้ใช้งานได้ดีมากสำหรับคู่ครองของฉัน & xterm ดูเหมือนจะเป็นหลักฐานกระสุน
GreggD

สรุป: who | awk 'END{print NR - 1}'เนื่องจากสิ่งที่คุณต้องการคือจำนวนบรรทัด - 1.
muru

0

วิธีง่ายๆอาจเป็นเพียงการเรียกใช้System Monitor(หากเริ่มต้นจากเทอร์มินัลคุณต้องเขียนgnome-system-monitor) และภายใต้แท็บ "กระบวนการ" จัดเรียงกระบวนการทำงานตามชื่อและนับจำนวนการเกิดขึ้นของBashรายชื่อในรายการ (พวกเขาทั้งหมดเข้าด้วยกัน ชื่อดังนั้นจึงนับได้ง่าย)

โปรดทราบว่าคุณต้องค้นหาBashและไม่ใช้Gnome Terminalหากคุณต้องการดูจำนวนเทอร์มินัลที่เปิดโดยผู้ใช้ เมื่อคุณเปิดเทอร์มินัลGnome Terminalจะปรากฏในรายการกระบวนการ แต่จะยังคงอยู่เพียงอันเดียวแม้ว่าจะเปิดเทอร์มินัลเพิ่มขึ้นก็ตาม ปุ่ม "ดู" ในSystem Monitorช่วยให้คุณกำหนดกระบวนการที่จะดูเช่น กระบวนการทั้งหมด / กระบวนการผู้ใช้ / ใช้งานอยู่ ...


เนื่องจาก OP ต้องการใช้ผลลัพธ์เพื่อตั้งค่าสีเทอร์มินัลโดยอัตโนมัตินี่จึงไม่ใช่ตัวเลือกที่เกี่ยวข้องจริงๆ
Jacob Vlijm

ขออภัยฉันเห็นตอนนี้เขาต้องการที่จะใช้มันในสคริปต์ แต่แล้ว ps -ef | grep ชื่อผู้ใช้ | grep bash | grep -v grep | สุขา -l ไม่ทำงาน?
NonStandardModel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.