<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Apr 10, 2024 at 5:50 PM Brian Reichert <<a href="mailto:reichert@numachi.com">reichert@numachi.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">My goal is to implement a service that runs after logrotate.service<br>
completes.<br>
<br>
logrotate.service is triggered by a timer logrotate.timer.<br>
<br>
I don't want to modify either of logrotate.service or logrotate.timer,<br>
as they are provided by the OS vendor (SLES 12 SP5, in my case.)<br></blockquote><div><br></div><div>In a sense, you're already modifying units provided by the OS vendor – whenever you use `systemctl enable` to link a service into multi-user.target.wants/, that "modifies" multi-user.target by adding a Wants= dependency, just that that happens in a way that does not get reset during package updates. Systemd has plenty of mechanisms for that; e.g. you can add additional settings to `/etc/systemd/system/logrotate.service.d/*.conf` (using systemctl edit) or you can link some units into logrotate.service.wants/ in the same way as is done with .targets.</div><div><br></div><div>(You need to do this to the .service, as that's what actually gets activated periodically.)</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
My current service file:<br>
<br>
  [Unit]<br>
  Description=Activities after logrotation<br>
<br>
  Requires=logrotate.service<br>
  Wants=logrotate.service<br></blockquote><div><br></div><div>That seems like the complete opposite of what you're trying to achieve – this makes *your* unit trigger the start of logrotate, not the other way around.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
  After=logrotate.service<br></blockquote><div><br></div><div>After= does not define a trigger. It only defines the execution order when multiple units are triggered at once.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
  [Service]<br>
  #Type=oneshot<br>
  Type=simple<br>
<br>
  ExecStart=/usr/bin/logger 'XXX post log rotation'<br>
<br>
  [Install]<br>
  WantedBy=timers.target<br></blockquote><div><br></div><div>The WantedBy= (or the .wants/ symlink that results from it) is the only trigger being defined in your unit. But since the service was set up to be started by timers.target, and timers.target itself only starts once during boot (when timers get scheduled), that means your service is also started once during boot and that's that.</div><div><br></div><div>If you want it to be triggered by logrotate.service, then you need WantedBy=logrotate.service. Then each time logrotate.service is started on schedule, it'll cause your service to be started as a dependency, and the After= will actually work to define the order.<br></div></div><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr">Mantas Mikulėnas</div></div></div>