Задача: соорудить сервис, состояние которого версионированно хранилось бы во внешнем хранилище. Из соображений производительности и надежности перед стартом его надо скачивать заново, а после остановки — заливать обратно, вне зависимости от причины и способа запуска и остановки. Ситуация внезапной смерти между стартом сервиса и окончанием заливки тут не рассматривается.
Наблюдение 1: есть ExecStartPre/ExecStopPost, но это 1) надо менять обрамляемый сервис, а прикольнее, если не надо 2) непонятно, как добавлять такое в NixOS в случае, если они уже однократно определены (они в NixOS не список).
Наблюдение 2: можно слепить oneshot-сервис из двух команд и попытаться жестко связать его lifetime с обрамляемым. Идеальным кандидатом видится BindsTo, но опять надо менять обрамляемый сервис (хотя уже понятнее как).
Наблюдение 3: нужно задать Before, иначе с порядком будут вольности. Так?
Наблюдение 4: можно задать BindsTo не в ту сторону, дополнив его RequiredBy. Не хватает уверенности, достаточно ли этого и симметричны ли отношения BindsTo+Before/BoundBy+After.
Итого cочинил черновичок:
systemd.services.nica-testservice = {
stopIfChanged = true;
requiredBy = [ "nginx.service" ];
bindsTo = [ "nginx.service" ];
before = [ "nginx.service" ];
script = ''
${pkgs.duplicity}/bin/duplicity --no-encryption file:///home/monk/duptest/testservice /var/lib/testservice
'';
preStop = ''
${pkgs.duplicity}/bin/duplicity --no-encryption /var/lib/testservice file:///home/monk/duptest/testservice; rm -rf /var/lib/testservice/*
'';
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
};
Вопросы: симметричны ли отношения BindsTo+Before/BoundBy+After? достиг ли я цели? где накосячил? не прописал ли лишнего?
Ретрограды цыц, вы так вообще не умеете.
nixos, systemd