Cara mendeteksi jumlah terminal yang dibuka oleh pengguna

9

Saya menggunakan Ubuntu dan secara manual dapat mengubah bashwarna prompt shell menjadi hijau menggunakan

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

Namun, saya ingin warna shell prompt berubah secara otomatis setiap kali saya membuka terminal atau tab baru. Saya sadar bahwa PERSYARATAN tty dasar memiliki 16 warna, dan tidak apa-apa untuk memutar warna jika lebih dari 16 terminal terbuka. Apakah solusinya juga berfungsi ketika saya terhubung melalui Putty, tmuxatau screen.

Ide saya adalah menulis skrip shell dan menempatkannya di .bashrcmana mendeteksi sesi terminal baru yang telah dibuka pengguna dan menambah counter global dari \e[0;31m[ke \e[0;47m[. Bagaimana cara mendeteksi jumlah terminal yang dibuka oleh pengguna?

manav mn
sumber

Jawaban:

8

Jika Anda benar-benar perlu mendapatkan jumlah terminal yang Anda buka, lakukan penghitungan file yang Anda miliki di bawah /dev/pts(walaupun ini mungkin termasuk yang dibuka oleh proses latar belakang, bukan oleh emulator terminal grafis). Atau, hitung jumlah proses anak dari emulator terminal Anda, seperti yang ditunjukkan oleh Jacob di baris pertama dari responsnya.

Hindari mengandalkan whokeluaran, dan mencari gnome-pty-helperproses, karena ini tidak bekerja di gnome-terminalversi yang lebih baru.

Perhatikan bahwa saat ini hampir semua emulator terminal grafis (termasuk dempul) dan multiplexer (layar, tmux) mendukung 256 warna. Anda bisa mendapatkan permintaan berwarna yang sangat bagus jika Anda menggunakan palet ini.

Rekomendasi saya untuk solusi yang sangat sederhana adalah mendasarkan warna pada nomor tty line saat ini. Misalnya, memproses output dari ttyperintah untuk mengambil nomor saja dan mendapatkan warna dari itu. Nomor baris tty tertentu hanya diberikan kepada satu terminal pada satu waktu, Anda harus menutup terminal itu terlebih dahulu sebelum nomor baris yang sama diterbitkan kembali oleh kernel. Ini, dikombinasikan dengan 256 warna, secara otomatis menjamin bahwa Anda tidak akan melihat warna yang sama dua kali pada waktu tertentu (dan bahkan dengan 16 warna itu akan memberikan distribusi yang cukup merata). Tidak perlu memelihara penghitung global, dan tidak perlu menghitung terminal atau proses.

egmont
sumber
1
Ide yang indah dengan tty. Saya kira kita / orang lain terlalu berkonsentrasi pada "pertanyaan" itu dan lupa bahwa mungkin ada solusi lain untuk seluruh "kebutuhan" :) Saya bahkan akan bermain dengan menerapkan pemilih warna acak. Jika 256 warna, memilih warna yang sama / mirip tidak akan banyak terjadi. Namun pengaturan warna secara manual untuk nomor poin yang diberikan akan memberikan personalisasi yang lebih baik.
GreggD
@ TEDM. Ya pertanyaan itu cukup banyak diutarakan sebagai pertanyaan XY, di sepanjang baris: "Saya ingin memiliki warna yang berbeda di setiap terminal, jadi katakan padaku: bagaimana cara menghitung jumlah terminal?"
egmont
@ TEDM. Acak juga ide yang bagus! (Salah satu properti dari pemetaan deterministik adalah bahwa setelah sudoing pengguna baru dapat dengan mudah mengatur warna prompt yang sama. Ini mungkin atau tidak mungkin apa yang ingin dimiliki oleh penanya semula.)
egmont
1
Randomizer cukup mudah: color="\e[38;5;"$(((RANDOM % 231 )+1))"m"(hanya 231 untuk menolak skala abu-abu), namun banyak dari warna-warna itu hanya warna yang berbeda dan beberapa dari mereka gelap sehingga mungkin hampir tidak terlihat dan saya tahu tidak ada yang akan menggunakannya dalam kehidupan nyata ...
GreggD
Kami tidak tahu versi Ubuntu penanya. Di 16.04 sudah pasti tidak ada lagi gnome-pty-helper ( git.gnome.org/browse/vte/commit/?id=299c700 ). Saya tidak akan menurunkan versi untuk memeriksa hierarki proses yang tepat di versi yang lebih lama. Saya tahu dulu ada proses seperti itu, saya hanya tidak sepenuhnya yakin bagaimana hirarki orang tua-anak. Ngomong-ngomong, saya mengambil ide proses-anak dari tanggapan awal Anda, jadi saya tidak mengerti bahwa "(juga oleh Anda)", tidak pernah.
egmont
5

Dalam situasi pengguna tunggal, jika kita mengambil contoh xterm, kita bisa menghitung jumlah pids xterm; xtermmembuat pid terpisah untuk setiap jendela.
gnome-terminalNamun menjalankan satu pid, tetapi kabar baiknya adalah ia menciptakan proses anak untuk setiap jendela dan / atau tab. kita dapat mengambil proses anak ini dengan perintah:

pgrep -P <pid_of_gnome-terminal>

Namun ada beberapa komplikasi yang harus dihadapi:

  • Membaca pertanyaan Anda, kami dapat berasumsi, bahwa pengguna dalam hal ini sebenarnya adalah pemilik sesi-x . Biasanya kita cukup menggunakan $USER-variable, tetapi ini mungkin tidak cocok dengan pengguna yang saat ini masuk $DISPLAY.

  • Dalam situasi multi-pengguna, pid milik aplikasi terminal (baik yang), tidak harus milik arus $DISPLAY. Kita perlu memisahkan hanya pids yang relevan dan pids anak.

  • Pada Unity (15.10 atau lebih rendah), jika pengguna kedua masuk, proses tambahan dimulai ( gnome-pty-helper), yang muncul sebagai proses anak dalam gnome-terminal, tetapi proses (jelas) tidak memiliki jendela atau tab. Pada Mate , prosesnya tetap ada.

Pendeknya

Untuk menghitung jumlah tab dan / atau jendela aplikasi terminal, kita perlu:

  • Lihat apakah kami menjalankan aplikasi terminal yang memiliki beberapa pids atau satu pid pada satu $DISPLAY(x-sesi)
  • Dari proses yang berjalan, pisahkan hanya pids yang relevan, jalankan ini$DISPLAY
  • Jika aplikasi menjalankan proses-anak untuk pidnya (untuk windows / tab), lihat apakah gnome-pty-helperberjalan, untuk memperbaiki nomor.

Namun ini dapat ditulis dengan sangat baik, untuk menemukan jumlah jendela dan / atau tab yang saat ini terbuka.

Naskah

Dalam skrip di bawah ini, aplikasi terminal yang ditargetkan digunakan sebagai argumen . Script berfungsi pada banyak terminal yang saya uji. Pengecualian ada Tildapada saat ini.

Sebuah contoh

  • Saya memiliki dua pengguna yang masuk, satu (bukan yang sekarang) dengan dua gnome-terminaljendela, satu (satu di gambar) dengan tiga gnome-terminaljendela, dan dua xtermjendela.

masukkan deskripsi gambar di sini

Perintah:

/path/to/get_terms.sh gnome-terminal

output:

3

sementara

/path/to/get_terms.sh xterm

output:

2

Naskah

#!/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

Menggunakan

  • Salin skrip ke file kosong, simpan sebagai get_terms.sh, buat dan jalankan dengan perintah:

    /path/to/get_terms.sh <terminal_application>
Yakub Vlijm
sumber
Di sini saya selalu punya satu yang gnome-pty-helperberjalan, bahkan ketika hanya ada satu pengguna yang masuk (tepat setelah reboot) dan ketika saya membuka sejumlah terminal ia berjalan kedua, pembantu yang sama. Skrip baru Anda tampaknya berfungsi untuk terminal-pasangan (tidak dapat menyebabkan nol-hal itu), tetapi dengan xterm, ketika saya hanya 1 membukanya, ia menunjukkan 0dan mulai menunjukkan angka yang baik hanya setelah yang kedua dan dengan terminal gnome-terminal itu selalu menunjukkan satu terlalu sedikit (keluaran 0ketika hanya satu dibuka).
GreggD
@ TEDM. Terima kasih, itu informasi yang berguna, diperbaiki sekarang.
Jacob Vlijm
Saya sangat mengagumi "hasrat" Anda :) ... tapi masih ada masalah dengan terminal gnome. Satu memberi 1, dua memberi 1, tiga memberi 2, empat memberi 3, dll. Ditambah penemuan baru saya, "Tilda" MATE (satu terminal "tidak dikenal" tambahan dalam jawaban saya) juga memiliki masalah yang sama dengan terminal gnome, tetapi dengan tab itu. xterm dan mate-terminal tampaknya berfungsi dengan baik.
GreggD
@ TEDM. Terima kasih telah menyebutkan! Pertanyaan konyol, tetapi Anda yakin menggunakan kode terbaru? Pada Mate 15.10 semua tes saya menjalankan pekerjaan tanpa kecuali. Apa versi Mate Anda? Pada Unity semuanya sudah bekerja dengan baik.
Jacob Vlijm
@ TEDM. Juga pada 15,10 Mate saya cukup kosong, itu ada di sana secara default. Ikuti saja tesnya, dengan sempurna! dapatkah saya meminta Anda besok atau lebih untuk menjalankan versi naskah yang diedit dan memposting hasilnya di suatu tempat, untuk melihat apa yang menyebabkan pengecualian dalam kasus Anda?
Jacob Vlijm
1

Sebuah awkcara:

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

Penjelasan:

Pada perintah 1 liner di atas, awkdigunakan untuk menemukan hitungan terminal. Di dalam awkprogram, itu hanya memeriksa jumlah baris yang dikembalikan oleh perintah siapa - 1.

mengintip
sumber
ini mengembalikan 0 untuk saya, yang jelas tidak benar ...
Zanna
Yang ini bekerja sangat baik untuk terminal pasangan saya & xterm, sepertinya tahan peluru.
GreggD
Secara ringkas:, who | awk 'END{print NR - 1}'karena yang Anda inginkan adalah jumlah baris - 1.
muru
0

Cara sederhana mungkin juga hanya untuk menjalankan System Monitor(jika dimulai dari Terminal Anda harus menulis gnome-system-monitor) dan di bawah tab "Proses" mengatur proses yang berjalan berdasarkan Nama dan kemudian menghitung jumlah kemunculan Bashdalam daftar (mereka akan bersama-sama jika Anda mengatur dengan nama, jadi mudah untuk dihitung).

Perhatikan bahwa Anda harus mencari Bashdan bukan Gnome Terminaljika Anda ingin melihat jumlah terminal yang dibuka oleh pengguna. Setelah Anda membuka Terminal Gnome Terminaljuga akan muncul di daftar Proses tetapi akan tetap hanya satu bahkan jika lebih banyak Terminal dibuka. Tombol "Lihat" di System Monitormemungkinkan Anda untuk mengatur proses mana yang akan dilihat, misalnya. Semua Proses / Proses Pengguna / Aktif ...

Model NonStandard
sumber
Karena OP ingin menggunakan hasilnya untuk secara otomatis mengatur warna terminal, ini sepertinya bukan opsi yang benar-benar relevan.
Jacob Vlijm
Maaf saya melihat sekarang dia ingin menggunakannya dalam skrip. Tapi kemudian ps-id | grep UserName | grep bash | grep -v grep | Apakah saya tidak bekerja?
NonStandardModel