Почему я не могу перенаправить вывод в некоторых случаях

Вариант использования этого двойного отношения аналогичен отношению «обеспечивает». systemd-timesyncdпредоставляет услугу синхронизации времени, поэтому она удовлетворяет любой зависимости устройства от time-sync.target. Он должен запускаться до time-sync.target, потому что он необходим для любой службы, которая зависит от синхронизации времени, и ему требуется time-sync.target, потому что любой модуль, полагающийся на синхронизацию времени, должен запускаться вместе со службой systemd-timesyncd.

Я думаю, что непонимание исходит из вашей интерпретации «хочет». Отношение «хочет» в systemd не является зависимостью :systemd-timesyncd, ему не нужно time-syncдля работы. Это отношение «начать вместе с» :, оно говорит о том, что конфигурирующий блок(systemd-timesyncd.service)хочет, чтобы перечисленные блоки(time-sync.target)запускались вместе с ним.

См. также Какой сервис предоставляет время -sync.target в systemd?

1
07.07.2020, 21:37
1 ответ
$ cat | sed -e 's/foo/bar/' > output.txt 
foo
^C
$ cat output.txt 
[nothing]

но:

$ cat | sed -e 's/foo/bar/' > output.txt 
foo
^D
$ cat output.txt 
bar

Записи в файлы --, но не в терминал --, обычно буферизуются библиотекой C (функциями stdio )в блоки размером в несколько килобайт. Если вы нажмете Ctrl -C, чтобы остановить конвейер, sedне успеет записать буферы до того, как он умрет, поэтому результирующий выходной файл будет пуст.(Можно сказать, что это ошибка в библиотеке C, которая не перехватывает сигнал завершения для этого, но так оно и есть.)

Plain catвероятно, не использует stdio,так как он не имеет дело с чем-то сложным, например, с линиями. Что-то вроде cat -nможет отличаться или нет.

Вы можете сделать так, чтобы вам не нужно было завершать канал с помощью Ctrl -C, а он завершался сам по себе. По крайней мере, в моем ncпараметр -qNговорит ему выйти через N секунд после закрытия stdin, поэтому, например.:

$ printf '' | nc -q0 localhost 22 | sed 's/SSH/FOO/' > output.txt 
$ cat output.txt 
FOO-2.0-OpenSSH_7.4p1 Debian-10+deb9u7

Кроме того, есть по крайней мере несколько способов отключить буферизацию, см., например, Отключить буферизацию в канале и`unbuffer `или `stdbuf `для удаления буферизации stdout?

Также GNU sed имеет переключатель -u/ --unbufferedна

load minimal amounts of data from the input files and flush the output buffers more often

3
18.03.2021, 23:21

Теги

Похожие вопросы