มีวิธีใดบ้างที่จะpgrepให้ข้อมูลทั้งหมดเกี่ยวกับแต่ละกระบวนการที่psทำ ฉันรู้ว่าฉันสามารถpsผ่านไปได้grepแต่มันก็มีการพิมพ์จำนวนมากและมันก็ทำให้ฉันมีgrepกระบวนการที่ฉันไม่ต้องการ
มีวิธีใดบ้างที่จะpgrepให้ข้อมูลทั้งหมดเกี่ยวกับแต่ละกระบวนการที่psทำ ฉันรู้ว่าฉันสามารถpsผ่านไปได้grepแต่มันก็มีการพิมพ์จำนวนมากและมันก็ทำให้ฉันมีgrepกระบวนการที่ฉันไม่ต้องการ
คำตอบ:
pgrepตัวเลือกการส่งออกค่อนข้าง จำกัด คุณจะต้องส่งข้อมูลกลับpsไปเพื่อรับข้อมูลที่สำคัญ ~/.bashrcคุณสามารถโดยอัตโนมัติโดยใช้ฟังก์ชั่นทุบตีในของคุณ
function ppgrep() { pgrep "$@" | xargs --no-run-if-empty ps fp; }
จากนั้นเรียกคำสั่งด้วย
ppgrep <pattern>
psความต้องการยัติภังค์สำหรับธง:function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
-rซึ่งจะดำเนินการคำสั่งเฉพาะเมื่อได้รับรายการเท่านั้น
ps fp $(pgrep -d, "$@")
รวมpgrepกับpsการใช้xargs!
pgrep <your pgrep-criteria> | xargs ps <your ps options> -p
ตัวอย่างเช่นลอง
pgrep -u user | xargs ps -f -p
userที่จะได้รับรายชื่อกระบวนการเต็มรูปแบบของ
มันดีที่คุณเก็บบรรทัดแรกด้วยชื่อคอลัมน์ grepปล่อยชื่อคอลัมน์เสมอ
ต่อไปนี้ให้ PID + บรรทัดคำสั่งแบบเต็มเท่านั้น สำหรับ "ข้อมูลทั้งหมดpsทำ" ดูคำตอบอื่น ๆ ...
Linuxes ส่วนใหญ่ใช้procps-ng ตั้งแต่ 3.3.4 (เปิดตัวในปี 2012), pgrep -a( --list-full) แสดงบรรทัดคำสั่งแบบเต็ม
หมายเหตุ: โดยค่าเริ่มต้น pgrep ตรงกับรูปแบบที่คุณให้กับชื่อที่ปฏิบัติการได้ หากคุณต้องการจับคู่กับบรรทัดคำสั่งแบบเต็ม (เหมือน grepping ps) ให้เพิ่มตัวเลือก-f( --full)
ในเวอร์ชันที่เก่ากว่า (รวมถึงโครงการprocpsดั้งเดิม) -lตัวเลือกแสดงข้อมูล แต่ลักษณะการทำงานแตกต่างกัน
pgrep -fl จับคู่รูปแบบกับบรรทัดคำสั่งแบบเต็มและแสดงบรรทัดคำสั่งแบบเต็มpgrep -lจับคู่เพียงชื่อที่ปฏิบัติการได้เท่านั้นและแสดงเฉพาะชื่อที่สามารถเรียกทำงาน ไม่แน่ใจว่าใช้รหัส * BSD ใด แต่หน้าเอกสารยืนยัน-flพฤติกรรมเก่า
น่าเสียดายที่คุณไม่สามารถใช้-flพอร์ตแบบพกพาได้ใน procps-ng เมื่อเร็ว ๆ นี้-f( --list-name) จะพิมพ์เฉพาะชื่อปฏิบัติการเท่านั้น
สำหรับรุ่น GNU ของ(กรณีไม่รู้สึก) ไม่ได้รับการสนับสนุนและยาว + เอาท์พุทเลือนจะประสบความสำเร็จกับpgrep-i-af
$ pgrep -af apache
OUTPUT:
1748 /usr/sbin/apache2 -k start
หน้าคน :
-a, --list-full
List the full command line as well as the process ID. (pgrep only.)
-f, --full
The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
บน OSX (และโดยการอนุมานบน BSD) -l( เอาต์พุตยาว ) ร่วมกับ-f( จับคู่กับรายการอาร์กิวเมนต์ทั้งหมด ) จะแสดงคำสั่งทั้งหมด ( -iเพิ่มตัวพิมพ์เล็กและตัวพิมพ์ใหญ่):
$ pgrep -fil ssh
OUTPUT:
33770 ssh: abc@192.168.0.123-22 [mux] t
หน้าคน :
-l Long output. For pgrep, print the
process name in addition to the
process ID for each matching
process. If used in conjunction
with -f, print the process ID and
the full argument list for each
matching process. For pkill, dis-
play the kill command used for
each process killed.
ใช้อ็อพชัน -v เพื่อ grep - ส่งคืนทุกอย่าง แต่รูปแบบที่ร้องขอ
ps -ef | grep <process> | grep -v grep
pgrep -u user | xargs ps -f -p
ฉันไม่คิดว่ามีข้อมูลส่วนใหญ่ที่คุณจะได้รับคือชื่อและรหัสกระบวนการโดยใช้ตัวเลือก -l เพื่อ pgrep
ps สนับสนุนตัวเลือกการจัดรูปแบบทุกประเภทดังนั้นฉันจะสร้างนามแฝงสำหรับสิ่งที่คุณต้องการบันทึกการพิมพ์ วิธีง่ายๆในการแยกกระบวนการ grep ออกจากเอาต์พุตเพื่อรวมไพพ์ไปgrep -v grepยังเพื่อแยกกระบวนการ grep ใด ๆ
เพื่อกำจัดgrepกระบวนการคุณสามารถใช้วงเล็บเป็นส่วนหนึ่งของรูปแบบของคุณ:
ps -ef | grep '[t]ty'
คุณสามารถทำได้ด้วยpsและpgrep:
ps -fp $(pgrep -d, tty)
สิ่งนี้จะช่วยให้คุณเดาได้ว่า:
ps auxww
function ppgrep() { pgrep "$@" | xargs ps fp 2> /dev/null; }มิฉะนั้นหากไม่มีกระบวนการใดที่ตรงกับการค้นหาของคุณก็จะทำให้ปริมาณpsการใช้งานทั้งหมดลดลง