ฉันจะใช้คำสั่งใดในการสร้างกระบวนการลูกสองกระบวนการตามลำดับ


8

ฉันต้องการที่จะวางไข่กระบวนการเด็กสองกระบวนการ แต่รอจนกว่าจะถึงจุดแรกในการดำเนินการของมัน (ซึ่งสามารถกำหนดได้โดยการตรวจสอบ stdout) ก่อนวางไข่ที่สอง ฉันไม่แน่ใจว่าคำสั่ง unix ใดที่จะเกี่ยวข้องกับการทำสิ่งนี้ให้สำเร็จและได้ยากในการค้นหาสิ่งใดผ่านทาง google เนื่องจากคำย่อและบางครั้งอาจเป็นความลับของชื่อคำสั่ง unix

ฉันไม่ได้กำลังหาทางแก้ไขปัญหาเฉพาะที่ฉันกำลังพยายามแก้ไข (แม้ว่าจะมีคำแนะนำเพิ่มเติมใด ๆ ก็ตาม) ฉันก็กังวลเป็นอย่างมากเกี่ยวกับการรู้ว่าคำสั่ง unix ใดที่ฉันต้องการค้นหาและเรียนรู้การใช้


คุณเปิดให้ใช้ Python หรือไม่?
xrisk

3
โดยไม่ทราบว่าคุณกำหนด "จุดที่แน่นอนในการดำเนินการของ" นี้จะคลุมเครือมาก
muru

@muru แก้ไขเพื่อชี้แจง
w.brian

ดังนั้นคุณต้องการ 3 กระบวนการจริง ๆ 1. รันสร้างเอาต์พุต 2. ตรวจสอบผลลัพธ์ของ 1 และ ณ จุดเริ่มต้นที่ 3 นี้เป็นข้อมูลเพียงพอที่จะให้คุณเริ่มทำสิ่งที่คุณกำลังทำ แต่มันไม่ใช่วิธีที่ดีในการออกแบบโปรแกรม
djsmiley2kStaysInside

คำตอบ:


7

คุณสามารถใช้xargsยูทิลิตีนี้ได้ มันสามารถรันคำสั่งสำหรับแต่ละบรรทัดบน stdin ดังนั้นเราเพียงแค่ต้องแน่ใจว่าxargsได้รับเป็นอินพุตบรรทัดเดียวบน stdin ในเวลาที่มันควรจะเริ่มคำสั่งซึ่งสามารถทำได้ด้วยgrep:

proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2

ข้อโต้แย้ง--max-count=1, --max-lines=1และ--no-run-if-emptyให้แน่ใจว่าproc2จะเริ่มต้นครั้งว่าถ้าและเมื่อproc1ผล${targetString}เป็นครั้งแรกและไม่เคยถ้าไม่เคยเอาท์พุทproc1 หลีกเลี่ยงที่ผนวกสายป้อนข้อมูลไปยังบรรทัดคำสั่ง${targetString}--replacexargs

ฉันใช้บรรทัดคำสั่งต่อไปนี้เพื่อทดสอบ:

(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"

1
+1 นี่คือคำตอบที่สร้างสรรค์มาก มันจะซับซ้อนกว่านี้มากถึงแม้ว่าคุณจะต้องการเอาต์พุตที่เหลือจาก proc1 คุณต้องใช้สิ่งต่าง ๆ เช่นทีออฟและตัวอธิบายไฟล์เพิ่มเติมหรือไพพ์ที่มีชื่อ
โจ

7

ฉันไม่แน่ใจว่ามีคำสั่ง / คำตอบที่สง่างามสำหรับคำถามที่คุณถาม (เช่นไปถึงจุดหนึ่งในการดำเนินการ) - แต่มีเครื่องมือ / เทคนิคที่สามารถใช้แก้ปัญหาได้ซึ่งอาจเกี่ยวข้องมากกว่า 1 จาก ต่อไปนี้และสิ่งอื่น ๆ ที่ฉันยังไม่รู้:

  1. กระบวนการพื้นหลัง (&)
  2. การดำเนินการตามเงื่อนไข (&& และ ||)
  3. นอน
  4. รอ (ฉันคาดว่าสิ่งนี้จะเป็นประโยชน์อย่างยิ่ง - ถ้าคุณเริ่มงานมากกว่า 1 งานในเบื้องหลังมันจะรอจนกว่างานทั้งหมดจะเสร็จสิ้น)
  5. ไปป์ที่มีชื่อ (ซึ่งอาจเป็นกลไกในการพูดคุยระหว่างกระบวนการ)
  6. inodenotifywait

การเขียนและตรวจสอบไฟล์ล็อคก็เป็นเรื่องธรรมดาเช่นกัน (เคล็ดลับโปร - ถ้าคุณมีการควบคุมสิ่งแวดล้อมให้เขียนไปที่ ramdisk แทนที่จะเป็น / tmp - บน distros หลาย ๆ ตัวนี้คือ / dev / shm)


6

นี่เป็นเพียงแนวคิด แต่มีกระบวนการแรกที่ส่งออกไปยัง grep ให้ grep ไปป์ที่เอาต์พุตกับลูปของบรรทัดการอ่านและเปรียบเทียบแต่ละบรรทัดกับสิ่งที่คุณกำลังมองหา เมื่อพบแล้วให้เรียกใช้ proc2

#!/bin/bash
targetString="line you are looking for"
proc1 | grep "${targetString}" |
while read line
do
if [ "$line" = "${targetString}" ]; then
    proc2
fi
done

หากสามารถกำหนด "จุดหนึ่งในการดำเนินการ" ได้stdoutแล้วจะทำอย่างไรต่อไปนี้

proc1 | grep "stdout trigger string" && proc2

&&ควรเริ่มเมื่อมีการgrepส่งคืน0ซึ่งจะทำได้ก็ต่อเมื่อพบการแข่งขัน


1
grep จะดำเนินต่อไปจนกว่า stdin จะปิด มันจะไม่ส่งคืนสิ่งใด (0 หรืออย่างอื่น) จนกว่าจะถึงตอนนั้น
บ๊อบ

@Bob โอ้ขอบคุณ ... ฉันจะพยายามใช้ความคิดนี้ใหม่
Louis Waweru

@ บ๊อบมันจะยุ่งและแยกจากกันโดยเฉพาะและการใช้เครื่องมือในทางที่ผิด แต่คุณสามารถใช้ fail2ban เพื่อตรวจสอบไฟล์บันทึก (เช่นไปป์ stdout ไปยังไฟล์) จากนั้นตั้งโปรแกรมกฎเพื่อรันสคริปต์ที่สองเมื่อบรรทัดนั้นเป็น พบ ( แต่ผม Recon แก้ไขไฟล์ทริกเกอร์และการใช้ inotify เป็นทางออกที่สวยงามมากขึ้น)
davidgo

1
หาก targetstring เกิดขึ้นมากกว่าหนึ่งครั้งในเอาต์พุต proc1 proc2 จะทำงานหลายครั้ง ถ้าคุณทำอย่างproc2 &นั้นก็breakจะไม่เกิดขึ้น แต่นั่นจะปิดท่อและทำให้ proc1 ยุติก่อนเวลาอันควร หรือคุณสามารถตั้งค่าสถานะเมื่อเริ่มต้น proc2 และใช้เพื่อให้แน่ใจว่า proc2 จะไม่ทำงานอีกครั้ง เช่นเดียวกับคำตอบอื่น ๆ เอาต์พุต proc1 ที่เหลือจะถูกยกเลิกดังนั้นหากคุณต้องการมันจำเป็นต้องทำงานมากขึ้น
Joe

1
@ โจจุดที่ดี คำถามเดิมนั้นจริง ๆ แล้วแค่ถามว่ามีคำสั่งอะไรให้ทำงานด้วยดังนั้นนี่เป็นเพียงคำตอบที่แสดงให้เห็นถึงศักยภาพของคำสั่งเหล่านั้น (ส่วนใหญ่|และgrepที่นี่)
Louis Waweru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.