คุณจะทำให้คำสั่งนี้ง่ายขึ้นได้อย่างไร?


10

ฉันค่อนข้างใหม่กับ strace / netstat / ฯลฯ ฉันใช้คำสั่งนี้เพื่อติดตามกระบวนการ apache ที่จัดการคำขอของฉัน (telnet) มีวิธีทำให้มันง่ายขึ้นเล็กน้อยหรือไม่?

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \ 
    grep $(lsof -p `pidof telnet` | grep TCP | \
    perl -n -e'/localhost:(\d+)/ && print $1') | grep apache2 | \ 
    perl -n -e'/ESTABLISHED (\d+)/ && print $1')

ขอบคุณ!


คุณใช้งานก่อนหรือหลังคุณเริ่มกระบวนการ telnet หรือไม่
deltaray

หลังจากเริ่มต้นคุณต้องรอสองสามวินาทีเพื่อเชื่อมต่อกับ apache จากนั้นคุณสามารถเรียกใช้ strace ได้
Andrei Serdeliuc

1
หากคำสั่งของคุณใช้งานได้โปรดอย่าทำให้มันยุ่งยาก
Tom O'Connor

คำตอบ:


1

ฉันสามารถปรับปรุงเล็กน้อยของ Mark Henderson ด้วย $ () แทนที่จะเป็น `` และลบ grep ด้วย sed ที่ดีกว่า:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \
   sed -e "/telnet/s/^.*ESTABLISHED\ \|\/.*$//g")

ส่วนตัวฉันคิดว่า backticks ทำให้อ่านยาก นอกจากนี้พวกเขาไม่ซ้อนกันซึ่งแตกต่างจากไวยากรณ์ $ ()


+1, Script Fu ที่เหนือกว่าและตัวอย่างการเรียนรู้ที่ดีสำหรับคุณสมบัติเชลล์บางอย่าง
Jeff Ferland

สคริปต์นี้straceเข้าสู่ telnet ไม่ใช่ในกระบวนการ Apache ที่ให้บริการ
BMDan

2

strace -p $(ss -npt|sed -n "/:$(ss -npt|sed -n '/telnet/s/^.*\?:\([0-9]\+\).*/\1/p') \+u/s/.*,\(.*\),.*/\1/p")

ตราบใดที่คุณมีเพียงหนึ่งการtelnetทำงานนี้จะstraceเซิร์ฟเวอร์ที่เกี่ยวข้องถ้ามี

หากไม่มี ( เช่นคุณtelnetแก้ไขเซิร์ฟเวอร์ภายนอกล่าสุด) straceจะล้มเหลวstrace: option requires an argument -- 'p'


1
strace -p $(netstat -tnp|awk -F'[ /]+' "/:$(netstat -tnp|awk -F'[ :]+' 
"/\/telnet/{print \$5}") /&&/apache2/{print \$7}")

หรือจัดรูปแบบเพื่อให้อ่านง่ายขึ้นและด้วยสถานะ strace ของ OP ไม่เปลี่ยนแปลง:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5}") / && /apache2/ {print \$7}")

รายละเอียดภายในสุดก่อน:

netstat -tnp | awk -F'[ :]+' "/\/telnet/ {print \$5}"

แสดงให้ฉันเห็นโดยไม่ต้องแก้ไขที่อยู่ IP เป็นชื่อ DNS การเชื่อมต่อ TCP ที่ใช้งานอยู่ทั้งหมด ไพพ์ที่ไปยัง awk ซึ่งพิมพ์ฟิลด์ที่ห้าบนบรรทัดใด ๆ ที่ลงท้ายด้วย/telnetโดยที่ฟิลด์ถูกคั่นด้วยช่องว่างและโคลอนอย่างน้อยหนึ่งรายการ ฟิลด์นี้จะเป็นพอร์ตต้นทาง

วิธีปรับปรุง : สามารถเพิ่มความแข็งแกร่งได้มากขึ้นโดยการเพิ่ม a | head -n 1ไปยังส่วนท้ายหรือส่วน;exitในแอ็คชั่นของ awk แต่เวอร์ชันดั้งเดิมของคุณขาดความเท่าเทียมกันดังนั้นฉันจึงไม่ต้องการทำให้มันยาวขึ้น

netstat -tnp | awk -F'[ /]+' "/:**** / && /apache2/ {print \$7}")

****นี่คือส่วนหนึ่งที่ผมได้อธิบายไปแล้วข้างต้น ที่นี่ฉันกำลังมองหาบรรทัดใด ๆnetstat -tnpที่มีพอร์ตเดียวกับพอร์ตต้นทางที่ฉันค้นพบด้านบนและเป็นของ Apache เมื่อฉันพบฉันพิมพ์เขตข้อมูลที่เจ็ด (คั่นด้วยช่องว่างหนึ่งหรือหลายช่องหรือทับ) นี่คือ PID ของลูก Apache

เพื่อปรับปรุง : นอกเหนือจากการคืนค่า PID เพียงตัวเดียว (ผ่านวิธีเดียวกับด้านบน) สิ่งที่ยิ่งใหญ่ที่สุดที่ฉันสามารถจินตนาการได้คือการเลือกปฏิบัติมากขึ้นเมื่อมันเข้าคู่ dport จริงเมื่อเทียบกับรูปแบบอื่น การทำเช่นนี้ทำได้โดยง่ายโดยการเพิ่มโคลอนลงใน FS ( -F) แต่ปัญหาเกิดขึ้นในสถานการณ์ IPv4 ผสมกับ IPv6 ซึ่งอาจมีโคลอนในที่อยู่ของตัวเองและอาจทำให้น่ารังเกียจได้อย่างรวดเร็ว ดูเหมือนว่าจะแข็งแกร่งมากโดยเฉพาะอย่างยิ่งกับพื้นที่ต่อท้าย

sudo strace -o /tmp/strace -f -s4096 -r -p

นี่เป็นสำเนาโดยตรงจากคำถามเดิมของคุณ ฉันไม่ได้แก้ไขอย่างน้อย

ถ้าคุณจะอนุญาตให้ฉันเพิ่มตัวละครสักสองสามตัวเวอร์ชันที่ฉันใช้อาจเป็น:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5;exit}") / && /apache2/ {print \$7;exit}")

0

ลองนี้หวังว่าจะช่วย:

sudo strace -o /tmp/strace -f -s4096 -r -p `netstat -antlp | \
  grep telnet | sed -e "s/^.*ESTABLISHED\ \|\/.*$//g"`

คำตอบจะดูดีขึ้นหากคุณไม่ต้องเลื่อนไปทางขวาเพื่อดูทั้งหมด
djangofan

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