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
.+1 untuk @jamzed jawaban singkat, namun OP mungkin perlu penjelasan:
Menggunakan regex itu, Anda meluncurkan proses yang string psnya tidak akan cocok dengan dirinya sendiri, karena regexp cocok
"django"
dan tidak"[d]jango"
. Dengan begitu Anda akan mengecualikan proses yang memiliki string "[d] jango" yang dalam hal ini adalah grep; Hal yang sama dapat diterapkan ke pgrep, egrep, awk, sed, dll ... perintah mana pun yang Anda gunakan untuk mendefinisikan regex.Dari man 7 regex
sumber
ps aux | grep [s]cript1
. Bisakah Anda membantu mengomentari solusinya?ps | grep [d]jango
ps | grep d[j]ango
...
ps | grep djang[o]
sumber
ps aux| grep "[Z] "
ps aux | grep [s]cript1
ataups aux | grep [s]cript2
. Baris grep masih ditampilkan. Bisakah Anda membantu mengomentari solusinya?Gunakan pgrep sebagai gantinya:
pgrep -lf django
sumber
pgrep
memberi saya persis masalah ini. Tapi saya harus mengatakan saya sedang mengujinya di CygWin (di manaps
tidak dapat menunjukkan baris perintah penuh dari proses).pgrep
cocok dengan dirinya sendiri. Ternyata itu cocok dengan namabash
file skrip tempat saya menjalankannya. Menambahkan-x
memperbaikinya, lalu melakukan pencocokan tepat pada nama perintah.Oh, tunggu, ini berfungsi:
sumber
grep
, yang tidak dapat Anda andalkan dalam kasus umum.ps -d | grep django
dari man ps:
sumber
ps
non-portable ini terkenal, jadi tanpa informasi tentang platform ini, jawaban ini tidak terlalu membantu. Lebih jauh lagi, ini jelas tidak memadai ketika Anda tidak yakin bahwa proses yang Anda cari bukanlah pemimpin proses (yaitu ini dapat membantu jika target Anda adalah daemon, tetapi umumnya tidak sebaliknya).