Я предлагаю использовать именованный канал над файлом, созданным 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
Используя именованный канал, мы можем использовать вывод фонового процесса так же, как если бы он шел из канала.