จะป้องกันไม่ให้“ ps” รายงานกระบวนการของตัวเองได้อย่างไร


52
$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

มีวิธีป้องกันกระบวนการสุดท้าย (นั่นคือ grep ที่เริ่มในเวลาเดียวกันกับคำสั่ง ps ของฉัน) หรือไม่?

(ฉันเริ่มพยายามหา regex ที่จะตรงกับตัวอักษร แต่ไม่ตรงกับตัวเอง แต่ดูเหมือนว่าอืมไม่ใช่วิธีที่เหมาะสม ... )

คำตอบ:


14

คำตอบของฉันคือรูปแบบของคำตอบทั่วไปสำหรับการค้นหา "foobar" ในpsรายชื่อ เหตุผลของการ"-A" "ps"พกพานั้นดีกว่า"aux"ฉันเชื่อ แต่การเปลี่ยนแปลงนี้ไม่เกี่ยวข้องกับคำตอบ คำตอบทั่วไปมีลักษณะดังนี้:

$ ps -A -ww | grep [f]oobar

ฉันใช้รูปแบบนี้แทน:

$ ps -A -ww | grep [^]]foobar

ข้อได้เปรียบหลักคือมันง่ายกว่าในการเขียนสคริปต์ตามรูปแบบนี้เพราะคุณเพียงแค่เชื่อมสตริงคงที่[^]]กับรูปแบบใดก็ตามที่คุณกำลังมองหา คุณไม่จำเป็นต้องถอดอักษรตัวแรกของสตริงออกจากนั้นใส่ระหว่างเครื่องหมายวงเล็บเหลี่ยมแล้วต่อกลับเข้าด้วยกันอีกครั้ง เมื่อสคริปต์ในเชลล์มันง่ายกว่าที่จะ[^]]ต่อหน้ารูปแบบที่คุณมองหาเพื่อหา การหั่นสตริงใน Bash เป็นสิ่งที่น่าเกลียดดังนั้นความแปรปรวนของฉันจึงหลีกเลี่ยง ชุดรูปแบบนี้บอกว่าแสดงบรรทัดที่รูปแบบตรงกันโดยไม่มีวงเล็บปีกกาขวานำ] เนื่องจากรูปแบบการค้นหาเพื่อแยกวงเล็บเหลี่ยมเพิ่มจริงวงเล็บเหลี่ยมสี่เหลี่ยมให้กับรูปแบบแล้วมันจะไม่ตรงกับตัวเอง

ดังนั้นคุณสามารถเขียนpsgrepคำสั่งแบบพกพาได้ดังนี้ ที่นี่ฉันให้ค่าเผื่อความแตกต่างระหว่าง Linux, OS X BSD และอื่น ๆ สิ่งนี้จะเพิ่มส่วนหัวของคอลัมน์จากpsให้ข้อมูลเพิ่มเติมที่กำหนดเองpsรูปแบบที่เหมาะสมกับความต้องการของฉันนักพนันและแสดงกระบวนการที่แสดงรายการกว้างพิเศษเพื่อไม่ให้มีการขัดแย้งในบรรทัดคำสั่ง ส่วนใหญ่ไม่ควรพลาด Java เป็น Java มันมักจะทำสิ่งต่าง ๆ ในวิธีที่แย่ที่สุดดังนั้นคุณจะต้องให้บริการ java บางอย่างผ่านความยาวสูงสุดของอาร์กิวเมนต์ที่ตารางกระบวนการจะติดตาม ฉันเชื่อว่านี่คือ 1024 ตัวอักษร ความยาวคำสั่ง - โลนที่ได้รับอนุญาตให้เริ่มกระบวนการมีความยาวมากขึ้น แต่ตารางกระบวนการเคอร์เนลไม่สนใจที่จะติดตามสิ่งใดที่มีความยาวเกิน 1K เมื่อคำสั่งเริ่มต้นแล้วคำสั่งชื่อและรายการอาร์กิวเมนต์ไม่จำเป็นต้องใช้ดังนั้นสิ่งที่ได้รับการจัดเก็บในตารางกระบวนการเป็นเพียงการให้ข้อมูล

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
}

ข้อเสียคือสิ่งนี้จะตรงกับหนึ่งอักขระมากกว่า (ด้านหน้า) มากกว่ารูปแบบดั้งเดิม สำหรับตัวอย่างสิ่งนี้จะไม่ตรงกับ PID grep --colourและสามารถเป็นบิตทำให้เข้าใจผิดเมื่อใช้กับ
Tonin

67

+1 สำหรับ @jamzed terse answer แต่ OP อาจต้องการคำอธิบายบางอย่าง:

ps | grep "[d]jango"

ใช้ regex ว่าคุณมีการเปิดตัวกระบวนการที่สตริง PS มันจะไม่ตรงกับตัวเองตั้งแต่การแข่งขัน regexp และไม่ได้"django" "[d]jango"ด้วยวิธีนี้คุณจะยกเว้นกระบวนการที่มีสตริง "[d] jango" ซึ่งในกรณีนี้คือ grep เดียวกันสามารถนำไปใช้กับ pgrep, egrep, awk, sed, ฯลฯ ... คำสั่งใดก็ตามที่คุณใช้ในการกำหนด regex

จากผู้ชาย 7 regex

   A bracket expression is a list of characters enclosed in "[]".  It nor‐
   mally matches any single character from the list (but see  below).   If
   the  list  begins  with  '^',  it matches any single character (but see
   below) not from the rest of the list.  If two characters  in  the  list
   are  separated  by '-', this is shorthand for the full range of charac‐
   ters between those two (inclusive) in the collating sequence, for exam‐
   ple,  "[0-9]" in ASCII matches any decimal digit.  It is illegal(!) for
   two ranges to share an endpoint, for example, "a-c-e".  Ranges are very
   collating-sequence-dependent,  and portable programs should avoid rely‐
   ing on them.

2
เย็น. ฉันค่อนข้างสบายใจกับ regexs แต่ไม่สามารถคิดได้ทันทีว่าจะป้องกัน regexp ที่ตรงกันได้อย่างไร การใส่ตัวอักษรในวงเล็บเหลี่ยมทำให้รู้สึกสมบูรณ์แบบ (รวมถึงบางอย่างเช่น [^!] ก็จะใช้ได้เช่นกัน ... )
Steve Bennett

1
นั่นเป็นเรื่องดีและมีเล่ห์เหลี่ยม
เถ้า

สำหรับกรณีเฉพาะ 'ps' ฉันใช้ '[]' ที่ด้านหน้าชื่อกระบวนการที่ฉันกำลังค้นหา จากนั้นฉันไม่จำเป็นต้องวิเคราะห์ชื่อกระบวนการพิเศษสำหรับ regex แต่มันยังคงตรงกัน
Neromancer

@hmontoliu มันไม่ทำงานตัวอย่าง: ps aux | grep [s]cript1. คุณช่วยแสดงความคิดเห็นเกี่ยวกับวิธีแก้ปัญหาได้หรือไม่
SOUser

@hmontoliu ความผิดของฉัน ดูเหมือนว่าบรรทัดจะปรากฏขึ้นเนื่องจากการค้นหาก่อนหน้า ...
SOUser

30

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]


เพิ่มพื้นที่ถ้าคุณต้องการ grep หนึ่งอักขระ:ps aux| grep "[Z] "
โฆษณา

@jamzed มันไม่ทำงานตัวอย่างเช่น: หรือps aux | grep [s]cript1 ps aux | grep [s]cript2บรรทัด grep ยังคงแสดงอยู่ คุณช่วยแสดงความคิดเห็นเกี่ยวกับวิธีแก้ปัญหาได้หรือไม่
SOUser

@jamzed ความผิดของฉัน ดูเหมือนว่าบรรทัดจะปรากฏขึ้นเนื่องจากการค้นหาก่อนหน้า ...
SOUser

18

ใช้ pgrep แทน: pgrep -lf django


ตามปกติฉันลืมที่จะพูดถึงแพลตฟอร์ม (OS X ในกรณีนี้) pgrep น่าจะใช้งานได้กับ linux ต่างๆ
Steve Bennett

ฉันไม่เห็นด้วย @ramruma ฉันมาที่หัวข้อนี้อย่างแม่นยำเพราะpgrepให้ปัญหานี้กับฉันอย่างแน่นอน แต่ฉันต้องบอกว่าฉันกำลังทดสอบมันใน CygWin (ที่psไม่สามารถแสดงบรรทัดคำสั่งแบบเต็มของกระบวนการ)
Sopalajo de Arrierez

คู่มือระบุ "กระบวนการ pgrep หรือ pkill ที่ทำงานอยู่จะไม่รายงานตัวเองว่าเป็นการแข่งขัน" และแน่นอนว่าฉันไม่เคยเห็นมาก่อน
deltab

ฉันเพิ่งจะจัดการกับปัญหาที่ฉันคิดว่าpgrepกำลังจับคู่ตัวเอง กลับกลายเป็นว่ามันตรงกับชื่อของbashไฟล์สคริปต์ที่ฉันเรียกใช้จาก การเพิ่ม-xแก้ไขมันแล้วมันจะตรงกับชื่อคำสั่ง
andynormancx

11

โอ้รองานนี้:

ps | grep django | grep -v grep

7
เฉพาะในกรณีที่บรรทัดคำสั่งของกระบวนการไม่ถูกต้องตามกฎหมายgrepซึ่งคุณไม่สามารถนับได้ในกรณีทั่วไป
CVn

8

ps -d | grep django

จากคน ps:

 -d                  Lists information  about  all  processes
                     except session leaders.

ยังคงแสดง grep ในของฉัน ...
Kevin

ใช่นั่นใช้ได้กับฉันใน OS X
Steve Bennett

ใช้งานไม่ได้กับ Linux
คิวเมนตัส

โดยทั่วไปแล้วตัวเลือกpsต่าง ๆ ที่ไม่ใช่แบบพกพาที่ฉาวโฉ่ดังนั้นหากไม่มีข้อมูลเกี่ยวกับแพลตฟอร์มนี้สำหรับคำตอบนี้ไม่มีประโยชน์มาก นอกจากนี้เห็นได้ชัดว่าไม่เพียงพอเมื่อคุณไม่แน่ใจว่ากระบวนการที่คุณกำลังมองหาไม่ใช่ผู้นำกระบวนการ (เช่นนี้อาจช่วยได้หากเป้าหมายของคุณคือภูต แต่ไม่ใช่โดยทั่วไป)
tripleee

ตลกบน Mac นี้ดูเหมือนว่าจะเพียงแสดงกระบวนการ grep และกรองทุกอย่างอื่นออก
Christopher Hunter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.