Trong một tình huống người dùng, nếu chúng ta lấy ví dụ về xterm
, chúng ta có thể chỉ cần đếm số lượng pids của xterm
; xterm
tạo ra một pid riêng cho mỗi và mọi cửa sổ.
gnome-terminal
tuy nhiên chạy một pid duy nhất, nhưng tin tốt là nó tạo ra một tiến trình con cho mỗi và mọi cửa sổ và / hoặc tab. chúng ta có thể truy xuất các tiến trình con này bằng lệnh:
pgrep -P <pid_of_gnome-terminal>
Tuy nhiên, có một vài biến chứng để giải quyết:
Đọc câu hỏi của bạn, chúng tôi có thể cho rằng người dùng trong trường hợp này thực sự là chủ sở hữu của phiên x . Thông thường chúng ta chỉ có thể sử dụng $USER
-variable, nhưng điều này có thể không phù hợp với người dùng hiện đang đăng nhập $DISPLAY
.
Trong tình huống nhiều người dùng, các pids thuộc về ứng dụng đầu cuối (hoặc là), không nhất thiết phải thuộc về hiện tại $DISPLAY
. Chúng ta chỉ cần tách ra các pids và pids trẻ em có liên quan.
Trên Unity (15.10 trở xuống), nếu người dùng thứ hai đăng nhập, một quy trình bổ sung được bắt đầu ( gnome-pty-helper
), xuất hiện dưới dạng một tiến trình con gnome-terminal
, nhưng quá trình (rõ ràng) không có cửa sổ hoặc tab. Trên Mate , quá trình tồn tại dù sao đi nữa.
Nói ngắn gọn
Để đếm số lượng tab và / hoặc cửa sổ của ứng dụng đầu cuối, chúng ta cần:
- Xem nếu chúng tôi chạy một ứng dụng đầu cuối có nhiều pids hoặc một pid trên một
$DISPLAY
(phiên x)
- Từ tiến trình đang chạy, tách ra chỉ là PID có liên quan, chạy về vấn đề này
$DISPLAY
- Nếu ứng dụng chạy các tiến trình con cho pid của nó (đối với windows / tab), hãy xem nếu
gnome-pty-helper
chạy, để sửa số.
Điều này rất có thể được viết kịch bản, tuy nhiên, đáng tin cậy để tìm số lượng cửa sổ và / hoặc tab hiện đang mở.
Kịch bản
Trong đoạn script bên dưới, ứng dụng đầu cuối được nhắm mục tiêu được sử dụng làm đối số . Kịch bản hoạt động trên nhiều thiết bị đầu cuối mà tôi đã thử nghiệm. Một ngoại lệ là Tilda
tại thời điểm này.
Một ví dụ
- Tôi có hai người dùng đăng nhập, một (không phải hiện tại) có hai
gnome-terminal
cửa sổ, một (một trong hình) với ba gnome-terminal
cửa sổ và hai xterm
cửa sổ.
Lệnh:
/path/to/get_terms.sh gnome-terminal
đầu ra:
3
trong khi
/path/to/get_terms.sh xterm
đầu ra:
2
Kịch bản
#!/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
Để sử dụng
Sao chép tập lệnh vào một tệp trống, lưu nó dưới dạng get_terms.sh
, làm cho nó có thể thực thi được và chạy nó bằng lệnh:
/path/to/get_terms.sh <terminal_application>
tty
. Tôi đoán rằng chúng tôi / những người khác đã tập trung quá nhiều vào "câu hỏi" đó và quên rằng có thể có các giải pháp khác cho toàn bộ "nhu cầu" :) Tôi thậm chí sẽ chơi với việc thực hiện bộ chọn màu ngẫu nhiên. Nếu là 256 màu, việc chọn các màu giống nhau / tương tự sẽ không xảy ra nhiều. Tuy nhiên, cài đặt màu thủ công cho các số pts đã cho sẽ giúp cá nhân hóa tốt hơn.