Jawaban saya adalah variasi pada jawaban khas untuk mencari "foobar" di ps
daftar. Argumen "-A" "ps"
lebih portabel daripada "aux"
, saya percaya, tetapi perubahan ini tidak relevan dengan jawabannya. Jawaban khasnya terlihat seperti ini:
$ ps -A -ww | grep [f]oobar
Sebagai gantinya saya menggunakan pola ini:
$ ps -A -ww | grep [^]]foobar
Keuntungan utama adalah bahwa lebih mudah untuk menulis skrip berdasarkan pola ini karena Anda hanya menyatukan string statis [^]]
dengan pola apa pun yang Anda cari. Anda tidak perlu melepas huruf pertama dari string kemudian memasukkannya di antara kurung kurawal dan kemudian menyatukannya kembali. Ketika skrip di shell lebih mudah untuk tetap [^]]
di depan pola yang Anda cari untuk dicari. Mengiris tali di Bash adalah hal yang jelek, jadi variasi saya menghindari itu. Variasi ini mengatakan perlihatkan garis-garis di mana polanya cocok TANPA tanda kurung siku kanan]. Karena pola pencarian untuk mengecualikan braket persegi sebenarnya menambahkan braket persegi ke pola maka tidak akan pernah cocok dengan dirinya sendiri.
Jadi Anda bisa menulis psgrep
perintah portabel sebagai berikut. Di sini, saya membuat beberapa perbedaan antara Linux, OS X BSD, dan lainnya. Ini menambahkan header kolom dari ps
, memberikan lebih banyak kustomps
format yang sesuai dengan kebutuhan saya, dan menampilkan daftar proses ekstra, ekstra lebar sehingga tidak ada argumen baris perintah yang terlewatkan. Yah, sebagian besar tidak ketinggalan. Java menjadi Java, sering kali melakukan hal-hal dengan cara terburuk yang mungkin, sehingga Anda beberapa layanan java akan berjalan melewati argumen panjang maksimum yang dibolehkan bahwa tabel proses akan melacak. Saya percaya ini adalah 1024 karakter. Panjang command-lone yang diizinkan untuk memulai suatu proses jauh lebih lama, tetapi tabel proses kernel tidak repot untuk melacak apa pun yang panjangnya lebih dari 1K. Setelah perintah dimulai, nama-perintah dan daftar argumen tidak diperlukan, jadi apa yang disimpan dalam tabel proses hanyalah informasi.
psgrep ()
{
pattern=[^]]${1};
case "$(uname -s)" in
Darwin)
ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
Linux)
ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
*) # other UNIX flavors get a minimalist version.
ps -A -ww | grep -i -e ${pattern}
;;
esac
}
grep --colour
.