Tôi sẽ sử dụng các lệnh nào để tạo hai tiến trình con?


8

Tôi muốn sinh ra hai tiến trình con, nhưng đợi cho đến khi điểm đầu tiên đạt đến một điểm nhất định trong quá trình thực thi của nó (có thể được xác định bằng cách kiểm tra thiết bị xuất chuẩn) trước khi sinh ra lần thứ hai. Tôi không chắc những lệnh unix nào có liên quan đến việc thực hiện điều này và đã gặp khó khăn trong việc tìm kiếm bất cứ thứ gì thông qua google do tính chất ngắn gọn và đôi khi khó hiểu của các tên lệnh unix.

Tôi không tìm kiếm giải pháp cho vấn đề cụ thể mà tôi đang cố gắng giải quyết (mặc dù mọi gợi ý bổ sung sẽ được đánh giá cao), tôi chủ yếu quan tâm đến việc biết những lệnh unix nào tôi muốn tìm kiếm và học cách sử dụng.


Bạn có mở để sử dụng Python không?
xrisk

3
Không biết làm thế nào bạn xác định "điểm nhất định trong việc thực hiện", điều này rất mơ hồ.
muru

@muru chỉnh sửa để làm rõ
w.brian 17/2/18

Vì vậy, bạn thực sự cần 3 quá trình. 1. chạy, tạo đầu ra; 2. theo dõi đầu ra của 1 và tại một thời điểm nhất định bắt đầu 3. Đây là thông tin đủ để bạn bắt đầu thực hiện bất cứ điều gì bạn đang làm. Nhưng nó không phải là một cách tốt để thiết kế một chương trình.
djsmiley2kStaysInside 14/03/18

Câu trả lời:


7

Bạn có thể sử dụng các xargstiện ích cho việc này. Nó có thể chạy một lệnh cho mỗi dòng trên stdin, vì vậy chúng ta chỉ cần đảm bảo rằng xargsđược nhập dưới dạng một dòng trên stdin tại thời điểm cần khởi động lệnh, có thể được thực hiện bằng grep:

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

Những lập luận --max-count=1, --max-lines=1--no-run-if-emptyđảm bảo rằng proc2được bắt đầu đúng một lần nếu và khi proc1kết quả đầu ra ${targetString}cho lần đầu tiên, và không bao giờ nếu proc1không bao giờ kết quả đầu ra ${targetString}. Việc --replacetránh xargsnối thêm dòng đầu vào vào dòng lệnh của nó.

Tôi đã sử dụng dòng lệnh sau để kiểm tra nó:

(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 Đây là một câu trả lời rất sáng tạo. Nó sẽ trở nên phức tạp hơn đáng kể mặc dù nếu bạn cần phần còn lại của đầu ra từ Proc1. Bạn cần sử dụng những thứ như tee và mô tả tập tin bổ sung hoặc các đường ống được đặt tên.
Joe

7

Tôi không chắc chắn có một lệnh / câu trả lời tao nhã cho câu hỏi mà bạn đã hỏi (nghĩa là đạt đến một điểm nhất định trong quá trình thực thi) - nhưng có những công cụ / kỹ thuật có thể được sử dụng để đưa ra giải pháp, có thể liên quan đến hơn 1 những điều sau đây và có thể những điều khác tôi chưa biết:

  1. Quá trình tạo nền (&)
  2. Thực hiện có điều kiện (&& và ||)
  3. ngủ
  4. chờ đợi (tôi hy vọng điều này sẽ đặc biệt hữu ích - nếu bạn khởi chạy nhiều hơn 1 công việc trong nền, nó sẽ đợi cho đến khi tất cả các công việc được hoàn thành)
  5. Các ống được đặt tên (có thể cung cấp một cơ chế để nói chuyện giữa các quy trình).
  6. inodenotify chờ đợi

Viết và kiểm tra các tệp khóa cũng là một cách phổ biến (pro tip - nếu bạn có quyền kiểm soát môi trường, hãy ghi vào ramdisk thay vì / tmp - trên nhiều bản phát hành này là / dev / shm).


6

Đây chỉ là một ý tưởng, nhưng có quá trình đầu tiên dẫn đầu ra của nó thành grep. Có grep dẫn đầu ra của nó thành một vòng lặp đọc và so sánh từng dòng với những gì bạn đang tìm kiếm. Khi tìm thấy, thực thi Proc2.

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

Nếu "một điểm nào đó trong quá trình thực thi" có thể được xác định bởi stdout, thì làm thế nào sau đây?

proc1 | grep "stdout trigger string" && proc2

&&sẽ bắn khi greptrở về 0, điều này chỉ thực hiện khi tìm thấy kết quả khớp.


1
grep sẽ tiếp tục cho đến khi stdin được đóng lại. Nó sẽ không trả lại bất cứ điều gì (0 hoặc cách khác) cho đến khi đó.
Bob

@Bob Oh, cảm ơn bạn ... Tôi sẽ cố gắng viết lại ý tưởng này.
Louis Waweru

.... đã tìm thấy (nhưng tôi điều chỉnh lại tệp kích hoạt và sử dụng inotify là một giải pháp thanh lịch hơn)
davidgo

1
Nếu chuỗi mục tiêu xảy ra nhiều hơn một lần trong đầu ra Proc1, thì Proc2 sẽ được chạy nhiều lần. Nếu bạn đã làm proc2 &và sau đó break, điều đó sẽ không xảy ra, nhưng điều đó sẽ đóng đường ống và khiến Proc1 chấm dứt sớm. Ngoài ra, bạn có thể đặt cờ sau khi bắt đầu Proc2 và sử dụng nó để đảm bảo Proc2 không chạy lại. Cũng như câu trả lời khác, phần còn lại của đầu ra Proc1 bị loại bỏ, vì vậy nếu bạn cần nó, cần nhiều công việc hơn.
Joe

1
@Joe Điểm tốt. Câu hỏi ban đầu thực ra chỉ là hỏi về những lệnh nào có sẵn để làm việc với, vì vậy đây thực sự chỉ là một câu trả lời thể hiện một số tiềm năng của các lệnh đó (chủ yếu |grepở đây).
Louis Waweru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.