Bagaimana cara mendapatkan pid dari proses yang sedang berjalan menggunakan satu perintah yang mengurai output dari ps?

22

Saya mencari satu baris yang mengembalikan pid dari proses yang berjalan.

Saat ini saya punya:

ps -A -o pid,cmd|grep xxx|head -n 1

Dan ini mengembalikan tinju pid, command. Saya hanya perlu nomor pertama dari keluaran dan mengabaikan sisanya. Saya kira sedatau awkakan membantu di sini tetapi pengalaman saya dengan mereka terbatas.

Juga, ini memiliki masalah lain, itu akan mengembalikan pid grep jika xxx tidak berjalan.

Sangat penting untuk memiliki satu baris, karena saya ingin menggunakan kembali output untuk melakukan sesuatu yang lain, seperti membunuh proses itu.

Sorin
sumber
1
pipa melalui kepala dan tentukan garis untuk kembali dengan -n 1?
Mike McMahon

Jawaban:

28

Jika Anda hanya ingin pid dari proses Anda dapat menggunakan pgrepjika tersedia. pgrep <command>akan mengembalikan pid dari perintah (atau daftar pids jika ada lebih dari satu contoh dari perintah yang berjalan, dalam hal ini Anda dapat menggunakan headatau perintah lain yang sesuai)
Semoga ini bisa membantu!

another.anon.coward
sumber
+1 Penggunaan pgrep seperti biasa:kill `pgrep xxx`
Steve
20
@veve: Mungkin Anda harus melihat pkill.
Dijeda sampai pemberitahuan lebih lanjut.
7

Hanya perlu satu perintah lagi; Anda hanya menginginkan bidang pertama dari garis nilai yang dipisahkan ruang:

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

Ya, dua. Saya menambahkan grep lain untuk menghapus grep sendiri dari output.

chepner
sumber
6

Cukup gunakan pgrep, itu jauh lebih lurus ke depan

pgrep -o -x xxxx

Di atas memilih proses tertua dengan nama yang tepat


sumber
Dan karena OP ingin menggunakan perintah untuk mematikan proses, pkill(dengan argumen yang sama) akan menjadi pilihan paling langsung.
bstpierre
2

pidof xxx akan cukup di linux

herve3527
sumber
0

Berjalan di Cygwin jadi saya tidak bisa menggunakan -A dan -o, tetapi sesuatu seperti ini:

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580
AlG
sumber
0

Anda dapat melakukan sesuatu seperti

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

maka xxx haruslah nama proses dan itu tidak akan mengambil grep karena jangkar ^

Pizza
sumber