Как извлечь из фонового процесса? - PullRequest
0 голосов
/ 19 октября 2019

У меня есть скрипт, который запускает приложение. Приложение выдает какой-то вывод, который мне нужно извлечь из вывода, чтобы проверить это. Как я могу это сделать?

Например;

script1.sh

    #!/bin/sh

    app1 &
    app2

    ******
    Output:
    app1 -> "App1"
    app2 -> "APp2"

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Вы можете использовать nohup для перехвата вывода скрипта и grep в файле nohup. Ниже показано, как вы выполните команду в nohup:

nohup ./script.sh &

Она создаст файл nohup.out в текущем каталоге, который можно использовать для ваших целей.

0 голосов
/ 19 октября 2019

Я предлагаю использовать именованный канал над файлом, созданным nohup. Причина тонкая, но важная. Допустим, что ваше фоновое приложение выполняется за 10 секунд и выдает приличный объем данных. Чтобы nohup заработал, вам нужно дождаться завершения фонового приложения, прежде чем вы сможете обработать данные из этого файла. Вы упустите возможность использовать фоновый процесс, во-первых, параллелизм. Это верно не только для вывода nohup, но и для любого обычного файла.

Вот пример не ожидания завершения выполнения фонового файла:

$ { for i in {0..100}; do echo $i; sleep 0.1; done } > outfile &
[1] 2069
$ grep 1 outfile
1

Как вы можетевидите, процесс grep немедленно обрабатывает файл и завершает работу до того, как фоновое приложение завершит запись данных.

При использовании именованного канала процесс переднего плана, grep в этом случае, будет знать, что ему нужно подождатьдля трубы, чтобы закрыть. Обратите внимание на разницу:

$ mkfifo outpipe
$ { for i in {0..100}; do echo $i; sleep 0.1; done } > outpipe &
[1] 2173
$ grep 1 outpipe
1
10
11
12
13
14
15
16
17
18
19
21
31
41
51
61
71
81
91
100

Используя именованный канал, мы можем использовать вывод фонового процесса так же, как если бы он шел из канала.

...