Systemd динамически указывает имя службы

Вы можете использовать замену процесса[1]:

diff -y output1.txt <(your_program & sleep 1; kill $!)

Если your_programспособен генерировать огромные объемы данных за секунду (, как при тестировании с помощью yes(1)), то diffбудет очень трудно справиться с этим, и если вы не наложите какие-то осторожные ограничения, на месте это может снести вашу память и повесить вашу машину (и в лучшем случае создаст иллюзию того, что команда какое-то время "зависает" ). Вместо yesпопробуйте скрипт slowyes, например while echo y; do sleep.01; done.

Обратите внимание, что замена процесса <(...)выполняется параллельно ,поэтому diffне будет ждать завершения, прежде чем начать обработку своих данных.

Я думаю, вам будет лучше остановить your_programпосле того, как он сгенерирует некоторое количество строк, а не через некоторое время:

diff -y output1.txt <(your_program | head -n 1000)

В этом случае your_programдолжен быть уничтожен SIGPIPE, как обычно, с левой стороны конвейера. Если ваша программа игнорирует как ошибки SIGPIPE, так и write(2), то, пожалуйста, задайте другой вопрос об этом, либо как это исправить, либо как обойти это.

[1] если ваша оболочка не поддерживает замены процессов (как /bin/shв debian, а не bash), вы также можете использовать конвейер, как в другом ответе

{ your_program & sleep 1; kill $!; } | diff -y output1.txt -

Те же оговорки применимы и к этому случаю.

0
12.04.2021, 19:01
1 ответ

Обычно существует два способа работы с экземплярами сервисных модулей systemd. Либо используйте файлы в /etc/sysconfigдля каждого экземпляра, которые переопределяют, например. по умолчанию ОПЦИИ переменная(EnvironmentFileв определении службы загрузит такой файл и заполнит ОПЦИИ , см., например,systemctl show -p ExecStart sshd)или переопределит дополнительные определения единиц через «перетащите -в» каталог, например. <service>@instance.service.d.

Кстати, экземпляр ДОЛЖЕН иметь '@', иначе он не будет экземпляром.

Посмотрите, как он используется в сервисных единицах getty.

$ ls -l /usr/lib/systemd/system/getty@.service
-rw-r--r-- 1 root root 1958 Apr  9 00:22 /usr/lib/systemd/system/getty@.service
$ grep ^ExecStart /usr/lib/systemd/system/getty@.service
ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
$ systemctl -t service --state running list-units | grep getty
getty@tty1.service       loaded active running Getty on tty1 
0
28.04.2021, 22:53

Теги

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