ฆ่ากระบวนการหลังจากได้รับอนุญาตให้ทำงานได้ระยะหนึ่ง


13

ฉันต้องการ จำกัด เวลาที่grepคำสั่งโปรเซสอนุญาตให้รันหรือยังมีชีวิตอยู่

ตัวอย่างเช่น. ฉันต้องการทำสิ่งต่อไปนี้:

grep -qsRw -m1 "parameter" /var

แต่ก่อนที่จะรันgrepคำสั่งฉันต้องการ จำกัด ระยะเวลาที่grepกระบวนการใช้งานอยู่ให้พูดไม่เกิน 30 วินาที

ฉันจะทำสิ่งนี้ได้อย่างไร

และถ้าทำได้ฉันจะกลับหรือรีเซ็ตได้อย่างไรโดยไม่ จำกัด เวลาในภายหลัง


3
คุณไม่ได้ถามเรื่องนี้แล้ว? stackoverflow.com/questions/3061377/…

ไม่มีการท้าทายอื่น ๆ เพราะฉันไม่ได้รับคำตอบในการสอบสวนต้นกำเนิด Yael

4
@ Yael: คุณมีวิธีแก้ปัญหาที่ดีอย่างสมบูรณ์แบบก่อนหน้านี้ใช้timeoutและคุณยังได้รับคำแนะนำในการติดตั้ง มันหยาบคายที่จะเพิกเฉยต่อคำตอบนี้และทำซ้ำคำถามของคุณ
พอล R

ขออภัย แต่ไม่ฉันไม่ต้องการติดตั้งอะไรในระบบของฉัน THX yael

5
@yael: จากนั้นคุณต้องอัปเดตคำถามดั้งเดิมของคุณเพื่อรวมข้อ จำกัด นี้ไม่เพียง แต่ทำซ้ำคำถามและเริ่มต้นใหม่อีกครั้ง
Paul R

คำตอบ:


12

คุณสามารถใช้timelimitมันมีอยู่ในอูบุนตูเริ่มต้นหรือคุณสามารถรวบรวมมันเอง

timelimitดำเนินการคำสั่งและยุติกระบวนการวางไข่หลังจากเวลาที่กำหนดด้วยสัญญาณที่กำหนด สัญญาณ“ คำเตือน” จะถูกส่งก่อนจากนั้นหลังจากหมดเวลาสัญญาณ“ ฆ่า” ซึ่งคล้ายกับวิธีที่ init (8) ทำงานเมื่อปิดเครื่อง


2
มันไม่ได้อยู่ใน Ubuntus ของฉัน (เดสก์ท็อป 10.10, เซิร์ฟเวอร์ 11.04) ดังนั้นอาจไม่ใช่ค่าเริ่มต้น sudo aptitude install timelimitแต่ได้อย่างง่ายดายด้วยการคว้าอย่างรวดเร็ว ใช้งานได้ดีเมื่อติดตั้งแล้ว
วันที่

7

นี่คือทุบตีแฮ็คเล็กน้อยสำหรับการที่:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

โดยพื้นฐานแล้วมันจะเริ่มค้นหาในพื้นหลังจากนั้นเริ่ม subshell ที่รอ 30 วินาทีแล้วฆ่ากระบวนการค้นหา หากการค้นหาใช้เวลา <30s กระบวนการจะตายไปแล้ว ไม่ใช่ความคิดที่ดีที่จะฆ่ากระบวนการที่ตายไปแล้วเนื่องจากมีโอกาสน้อยมากที่บางสิ่งจะนำ pid กลับมาใช้ใหม่ แต่สำหรับบางอย่างเช่นนี้มันก็ไม่เป็นไร สุดท้ายการค้นหาจะถูกใส่กลับในเบื้องหน้าและจะทำงานจนกว่าจะเสร็จสิ้นหรือถูกฆ่า


วิธีรับเงิน จาก grep ในกรณีนี้เพราะในสคริปต์ของฉันฉันรับ $? จาก grep และตรวจสอบว่า grep ตรงกับสตริงหรือไม่ yael

ฉันไม่แน่ใจว่ามีวิธีที่ตรงไปตรงมาในการทำเช่นนั้น นอกจากนี้วิธีการนี้ใช้ไม่ได้กับสคริปต์ที่ bash ไม่มีการควบคุมงานเปิดใช้งาน คุณอาจต้องหันไปใช้แฮ็คเกอร์ Perl สักหน่อยเพื่อให้งานลุล่วงไปได้ด้วยสคริปต์ อืม ...
Walter Mundt

เป็นไปได้หรือไม่ที่จะมาถึงคำถามนี้เพื่อ Perl? Yael

4

สร้างไฟล์ใหม่ชื่อ "tgrep" และใส่ไว้ในไฟล์ต่อไปนี้ (หรือเรียกมันว่าอะไรก็ได้ที่คุณต้องการ):

#!/bin/bash
grep $@ &
PID=$!
sleep 30 && kill $PID 2>/dev/null &
wait $PID
exit 0

chmod a+x tgrepถัดไปวิ่ง ตอนนี้ถ้าคุณต้องการใช้มันคุณสามารถพิมพ์

./tgrep -i "results" /home/dan/*txt

หรือคุณสามารถใช้มันเป็น tgrep (โดยไม่ต้อง. / และสามารถใช้งานได้จากไดเรกทอรีใด ๆ ) หากคุณวางไว้ในไดเรกทอรีที่มีอยู่ในตัวแปร $ PATH ของคุณ (เช่น / home / dan / bin / ถ้าอยู่ใน ตัวแปร $ PATH ของคุณมิฉะนั้นคุณสามารถเพิ่มได้)

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