จะตัด PID จากคำสั่ง `ps aux` ได้อย่างไร

ฉันต้องการรับ pid จากกระบวนการของฉัน ฉันทำ ps aux | cut -d ' ' -f 2 แต่ฉันสังเกตว่าบางครั้งมันได้รับ pid และบางครั้งก็ไม่ได้:

[user@ip ~]$ ps aux 
user  2049  0.5 10.4 6059216 1623520 ?     Sl   date   8:48 process 
user 12290  0.3  6.9 5881568 1086244 ?     Sl   date  2:30 
[user@ip ~]$ ps aux | cut -d ' ' -f 2 

12290
[user@ip ~]$ ps aux |  cut -d ' ' -f 3
2049

โปรดสังเกตว่าคำสั่ง cut คำสั่งแรกส่งไปที่ 2 ในขณะที่คำสั่งที่สองส่งไปที่ 3 ฉันจะเลือก PID จากสิ่งเหล่านี้โดยไม่ต้องรู้ว่าจะใช้หมายเลขใด (2 หรือ 3) ได้อย่างไร

ใครช่วยกรุณาบอกฉันถึงความแตกต่างระหว่างสิ่งเหล่านี้และทำไมมันถึงเลือกอันหนึ่งและไม่ใช่อันอื่น


person makansij    schedule 01.09.2017    source แหล่งที่มา


คำตอบ (3)


-d ' ' หมายถึงการใช้ช่องว่างเดียวเป็นตัวคั่น เนื่องจากมี 1 ช่องว่างก่อนปี 2049 และ 2 ช่องว่างก่อน 12290 คำสั่งของคุณจึงได้รับ -f 2 และ -f 3

ฉันแนะนำให้ใช้ ps aux | awk '{print $2}' เพื่อรับ pid เหล่านั้น

หรือคุณสามารถใช้ tr เพื่อบีบช่องว่างเหล่านั้นก่อน ps aux | tr -s ' ' | cut -d ' ' -f 2

person CtheSky    schedule 02.09.2017

คุณสามารถใช้ตัวเลือก -o เพื่อพิมพ์เฉพาะ pid:

ps -u user -o pid
person Minh Tuan Nguyen    schedule 02.09.2017

คุณสามารถใช้ pgrep เพื่อรับ PID ของกระบวนการได้ตลอดเวลา

เช่น PID ที่มี PS AUX

wix@wsys:~$ ps aux | grep sshd
root      1101  0.0  0.0  72304  3188 ?        Ss   Oct14   0:00 /usr/sbin/sshd -D
root      6372  0.0  0.1 105692  7064 ?        Ss   06:01   0:00 sshd: wix [priv]
wix       6481  0.0  0.1 107988  5748 ?        S    06:01   0:00 sshd: wix@pts/1
root      6497  0.0  0.1 105692  7092 ?        Ss   06:01   0:00 sshd: wix [priv]
wix       6580  0.0  0.1 107988  5484 ?        S    06:01   0:00 sshd: wix@pts/2
wix       6726  0.0  0.0  13136  1044 pts/1    S+   06:12   0:00 grep --color=auto sshd

ตอนนี้เพียง pgrep เพื่อรับ PID

wix@wsys:~$ pgrep sshd
1101
6372
6481
6497
6580
wix@wsys:~$ 
person Waqar Afridi    schedule 15.10.2020
comment
สิ่งนี้เกี่ยวข้องกับคำถามของ OP อย่างไร - person Nicolas Melay; 15.10.2020
comment
ฉันคิดว่าเป้าหมายคือการได้รับ PID ดังนั้นทำไมไม่ใช้เครื่องมือที่มีอยู่แทนที่จะใช้สายคำสั่งที่ซับซ้อน - person Waqar Afridi; 16.10.2020
comment
เขาไม่ได้ระบุว่าเจตนาสุดท้ายของเขาคืออะไร แต่เนื่องจากการรวบรวม PID ของกระบวนการทั้งหมดของคุณดูเหมือนไม่มีจุดหมาย ฉันเดาว่าคุณคงคิดถูก - person Nicolas Melay; 20.10.2020
comment
แม้ว่าคุณต้องการกระบวนการทั้งหมดคุณก็สามารถทำ pgrep ได้ - person Ted Brownlow; 18.11.2020
comment
จะทำอย่างไรสำหรับ /sbin/lvmetad -f pgrep จะไม่แสดง PID - person Kishore; 17.02.2021