git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] maintenance: use systemd timers on Linux

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
May 2, 2021, 14:10 UTC
Message-ID
<b1153c47-05cf-877c-587b-8205d8d32816@gmail.com>
In-Reply-To
<CAPig+cQks0_nL1J4YUbEUjmWYLKrhuHX-f8PkWM2zFE4gybWMw@mail.gmail.com>
On 02/05/2021 07:45, Eric Sunshine wrote:
Show 8 quoted lines
> On Sat, May 1, 2021 at 10:59 AM Lénaïc Huard <lenaic@lhuard.fr> wrote:
>> The existing mechanism for scheduling background maintenance is done
>> through cron. On Linux systems managed by systemd, systemd provides an
>> alternative to schedule recurring tasks: systemd timers.
> 
> Thanks for working on this. While `cron` has been the go-to standard
> for decades, `systemd` is certainly widespread enough that it makes
> sense to support it, as well.

Yes, thank you for working on this, it will be very useful to users like me who use a linux distribution that does not install a cron daemon by default but relies on systemd instead.

Show 6 quoted lines
>> The main motivations to implement systemd timers in addition to cron
>> are:
>> * cron is optional and Linux systems running systemd might not have it
>>    installed.
>> * The execution of `crontab -l` can tell us if cron is installed but not
>>    if the daemon is actually running.

Can we use systemctl to see if it is running (and enabled so we know it will be restarted after a reboot)?

Show 40 quoted lines
>> * With systemd, each service is run in its own cgroup and its logs are
>>    tagged by the service inside journald. With cron, all scheduled tasks
>>    are running in the cron daemon cgroup and all the logs of the
>>    user-scheduled tasks are pretended to belong to the system cron
>>    service.
>>    Concretely, a user that doesn’t have access to the system logs won’t
>>    have access to the log of its own tasks scheduled by cron whereas he
>>    will have access to the log of its own tasks scheduled by systemd
>>    timer.
> 
> The last point is somewhat compelling. A potential counterargument is
> that `cron` does send email to the user by default if any output is
> generated by the cron job. However, it seems quite likely these days
> that many systems either won't have local mail service enabled or the
> user won't bother checking the local mailbox. It's a minor point, but
> if you re-roll it might make sense for the commit message to expand
> the last point by saying that although `cron` attempts to send email,
> that email may go unseen by the user.
> 
>> In order to schedule git maintenance, we need two unit template files:
>> * ~/.config/systemd/user/git-maintenance@.service
>>    to define the command to be started by systemd and
>> * ~/.config/systemd/user/git-maintenance@.timer
>>    to define the schedule at which the command should be run.
>> [...]
>> The timer unit contains `Persistent=true` so that, if the computer is
>> powered down when a maintenance task should run, the task will be run
>> when the computer is back powered on.
> 
> It would be nice for the commit message to also give some high-level
> information about how git-maintenance chooses between `cron` and
> `systemd` and whether the user can influence that decision. (I know
> the answer because I read the patch, but this is the sort of
> information which is good to have in the commit message; readers want
> to know why certain choices were made.)
> 
> Although I avoid Linux distros with `systemd`, my knee-jerk reaction,
> like brian's upthread, is that there should be some escape hatch or
> direct mechanism to allow the user to choose between `systemd` and
> `cron`.

I agree that if both are present the user should be able to choose one. I'm not sure what the default should be in that case - before I read the commit message and Eric's comments I was inclined to say that if the user has cron installed we should take that as a sign they preferred cron over systemd timers and use that. However, given the arguments above about not knowing if cron is running and the user not necessarily getting emails from cron or being able to read the logs than maybe defaulting to systemd timers makes sense.

Show 34 quoted lines
> The patch itself is straightforward enough and nicely follows the
> pattern established for already-implemented schedulers, so I don't
> have a lot to say about it. I did leave a few comments below, most of
> which are subjective nits and minor observations, though there are two
> or three actionable items.
> 
>> Signed-off-by: Lénaïc Huard <lenaic@lhuard.fr>
>> ---
>> diff --git a/Documentation/git-maintenance.txt b/Documentation/git-maintenance.txt
>> @@ -279,6 +279,55 @@ schedule to ensure you are executing the correct binaries in your
>> +BACKGROUND MAINTENANCE ON LINUX SYSTEMD SYSTEMD
>> +-----------------------------------------------
> 
> Is there a reason for the duplicated "SYSTEMD" that I'm missing? I
> suppose you probably mean "SYSTEMD SYSTEMS".
> 
>> +In this case, `git maintenance start` will create user systemd timer units
>> +and start the timers. The current list of user-scheduled tasks can be found
>> +by running `systemctl --user list-timers`. The timers written by `git
>> +maintenance start` are similar to this:
>> +
>> +-----------------------------------------------------------------------
>> +$ systemctl --user list-timers
>> +NEXT                         LEFT          LAST                         PASSED     UNIT                         ACTIVATES
>> +Thu 2021-04-29 19:00:00 CEST 42min left    Thu 2021-04-29 18:00:11 CEST 17min ago  git-maintenance@hourly.timer git-maintenance@hourly.service
>> +Fri 2021-04-30 00:00:00 CEST 5h 42min left Thu 2021-04-29 00:00:11 CEST 18h ago    git-maintenance@daily.timer  git-maintenance@daily.service
>> +Mon 2021-05-03 00:00:00 CEST 3 days left   Mon 2021-04-26 00:00:11 CEST 3 days ago git-maintenance@weekly.timer git-maintenance@weekly.service
>> +
>> +3 timers listed.
>> +Pass --all to see loaded but inactive timers, too.
>> +-----------------------------------------------------------------------
> 
> I suspect that the "3 timers listed" and "Pass --all" lines don't add
> value and can be dropped without hurting the example.

If the idea is to show the output of `systemctl --user list-timers` then I don't think we should be editing it. I also think having the column headers helps as it shows what the fields are.

Show 8 quoted lines
>> +`git maintenance start` will overwrite these files and start the timer
>> +again with `systemctl --user`, so any customization should be done by
>> +creating a drop-in file
>> +`~/.config/systemd/user/git-maintenance@.service.d/*.conf`.
> 
> Will `systemd` users generally understand what filename to create in
> the "...@.service.d/" directory, and will they know what to populate
> the file with? (Genuine question; I've never dealt with that.)

I think it would be helpful to explicitly mention the file names (I don't think I could tell you what they are without reading the relevant systemd man page)

Show 44 quoted lines
>> diff --git a/builtin/gc.c b/builtin/gc.c
>> @@ -1872,6 +1872,25 @@ static int schtasks_update_schedule(int run_maintenance, int fd, const char *cmd
>> +static int is_crontab_available(const char *cmd)
>> +{
>> +       struct child_process child = CHILD_PROCESS_INIT;
>> +
>> +       strvec_split(&child.args, cmd);
>> +       strvec_push(&child.args, "-l");
>> +       child.no_stdin = 1;
>> +       child.no_stdout = 1;
>> +       child.no_stderr = 1;
>> +       child.silent_exec_failure = 1;
>> +
>> +       if (start_command(&child))
>> +               return 0;
>> +       /* Ignore exit code, as an empty crontab will return error. */
>> +       finish_command(&child);
>> +
>> +       return 1;
>> +}
> 
> Ignoring the error from `crontab -l` is an already-established idiom
> in this file. Okay.
> 
> Nit: There doesn't seem to be a need for the blank line before `return
> 1`, and other maintenance-related functions don't have such a blank
> line. The same comment about blank lines before `return` applies to
> other newly-added functions, as well. But it's subjective, and not
> necessarily worth changing.
> 
>> +static char *systemd_timer_timer_filename()
>> +{
>> +       const char *filename = "~/.config/systemd/user/git-maintenance@.timer";
>> +       char *expanded = expand_user_path(filename, 0);
>> +       if (!expanded)
>> +               die(_("failed to expand path '%s'"), filename);
>> +
>> +       return expanded;
>> +}
> 
> I was curious whether this would fail if `.config/systemd/user/`
> didn't already exist, but looking at the implementation of
> expand_user_path() , I see that it doesn't require the path to already
> exist if you pass 0 for the second argument as you do here. Okay.

Do we need to worry about $XDG_CONFIG_HOME rather than hard coding "~/.config/". There is a function xdg_config_home() that takes care of this.

Thanks again for working on this
Best Wishes
Phillip
Previous: Eric SunshineNext: Đoàn Trần Công Danh
Message 6 of 138 in “maintenance: use systemd timers on Linux”
  1. maintenance: use systemd timers on LinuxLénaïc Huard, May 1, 2021
  2. brian m. carlsonMay 1, 2021
  3. Bagas SanjayaMay 2, 2021
  4. Eric SunshineMay 2, 2021
  5. Eric SunshineMay 2, 2021
  6. Phillip WoodMay 2, 2021
  7. Đoàn Trần Công DanhMay 5, 2021
  8. Phillip WoodMay 5, 2021
  9. Ævar Arnfjörð BjarmasonMay 5, 2021
  10. Lénaïc HuardMay 9, 2021
  11. Ævar Arnfjörð BjarmasonMay 10, 2021
  12. Bagas SanjayaMay 2, 2021
  13. Derrick StoleeMay 3, 2021
  14. 0/1 maintenance: use systemd timers on LinuxLénaïc Huard, May 9, 2021
  15. 1/1 maintenance: use systemd timers on LinuxLénaïc Huard, May 9, 2021
  16. Đoàn Trần Công DanhMay 10, 2021
  17. Eric SunshineMay 10, 2021
  18. Junio C HamanoMay 10, 2021
  19. Đoàn Trần Công DanhMay 12, 2021
  20. Felipe ContrerasMay 12, 2021
  21. Phillip WoodMay 12, 2021
  22. Phillip WoodMay 12, 2021
  23. Đoàn Trần Công DanhMay 12, 2021
  24. Phillip WoodMay 10, 2021
  25. Eric SunshineMay 10, 2021
  26. Phillip WoodMay 10, 2021
  27. Eric SunshineMay 10, 2021
  28. Lénaïc HuardJun 8, 2021
  29. Martin ÅgrenMay 10, 2021
  30. Phillip WoodMay 11, 2021
  31. Derrick StoleeMay 11, 2021
  32. 0/4 maintenance: use systemd timers on LinuxLénaïc Huard, May 20, 2021
  33. 2/4 maintenance: introduce ENABLE/DISABLE for code clarityLénaïc Huard, May 20, 2021
  34. 4/4 maintenance: optionally use systemd timers on LinuxLénaïc Huard, May 20, 2021
  35. Bagas SanjayaMay 21, 2021
  36. Derrick StoleeMay 21, 2021
  37. Johannes SchindelinMay 22, 2021
  38. Felipe ContrerasMay 23, 2021
  39. brian m. carlsonMay 23, 2021
  40. Felipe ContrerasMay 24, 2021
  41. Ævar Arnfjörð BjarmasonMay 24, 2021
  42. Junio C HamanoMay 24, 2021
  43. Johannes SchindelinMay 25, 2021
  44. Felipe ContrerasMay 25, 2021
  45. CoC, inclusivity etc. (was "Re: [...] systemd timers on Linux")Ævar Arnfjörð Bjarmason, May 26, 2021
  46. Felipe ContrerasMay 26, 2021
  47. Jeff KingMay 27, 2021
  48. Felipe ContrerasMay 27, 2021
  49. Junio C HamanoMay 27, 2021
  50. Phillip SusiMay 28, 2021
  51. Jeff KingMay 30, 2021
  52. Felipe ContrerasMay 24, 2021
  53. 1/4 cache.h: rename "xdg_config_home" to "xdg_config_home_git"Lénaïc Huard, May 20, 2021
  54. Đoàn Trần Công DanhMay 20, 2021
  55. 3/4 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, May 20, 2021
  56. Bagas SanjayaMay 21, 2021
  57. 0/4 add support for systemd timers on LinuxLénaïc Huard, May 24, 2021
  58. 4/4 maintenance: add support for systemd timers on LinuxLénaïc Huard, May 24, 2021
  59. Ævar Arnfjörð BjarmasonMay 24, 2021
  60. Eric SunshineMay 24, 2021
  61. Felipe ContrerasMay 24, 2021
  62. Phillip WoodMay 26, 2021
  63. 3/4 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, May 24, 2021
  64. Phillip WoodMay 24, 2021
  65. Lénaïc HuardMay 30, 2021
  66. Phillip WoodMay 30, 2021
  67. 2/4 maintenance: introduce ENABLE/DISABLE for code clarityLénaïc Huard, May 24, 2021
  68. Phillip WoodMay 24, 2021
  69. Đoàn Trần Công DanhMay 24, 2021
  70. Lénaïc HuardMay 25, 2021
  71. Junio C HamanoMay 25, 2021
  72. Ævar Arnfjörð BjarmasonMay 24, 2021
  73. 1/4 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, May 24, 2021
  74. Phillip WoodMay 24, 2021
  75. Đoàn Trần Công DanhMay 24, 2021
  76. Junio C HamanoMay 24, 2021
  77. 0/3 add support for systemd timers on LinuxLénaïc Huard, Jun 8, 2021
  78. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jun 8, 2021
  79. Jeff KingJun 9, 2021
  80. Phillip WoodJun 9, 2021
  81. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Jun 8, 2021
  82. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Jun 8, 2021
  83. Junio C HamanoJun 9, 2021
  84. Phillip WoodJun 9, 2021
  85. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jun 12, 2021
  86. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Jun 12, 2021
  87. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jun 12, 2021
  88. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Jun 12, 2021
  89. Eric SunshineJun 14, 2021
  90. Derrick StoleeJun 16, 2021
  91. Eric SunshineJun 17, 2021
  92. Phillip WoodJun 17, 2021
  93. Lénaïc HuardJul 2, 2021
  94. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jul 2, 2021
  95. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Jul 2, 2021
  96. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jul 2, 2021
  97. Ævar Arnfjörð BjarmasonJul 6, 2021
  98. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Jul 2, 2021
  99. Ævar Arnfjörð BjarmasonJul 6, 2021
  100. Junio C HamanoJul 6, 2021
  101. Jeff KingJul 13, 2021
  102. Eric SunshineJul 13, 2021
  103. Jeff KingJul 13, 2021
  104. Eric SunshineJul 13, 2021
  105. Bagas SanjayaJul 13, 2021
  106. Felipe ContrerasJul 6, 2021
  107. Lénaïc HuardAug 23, 2021
  108. Junio C HamanoAug 23, 2021
  109. Junio C HamanoJul 2, 2021
  110. Phillip WoodJul 6, 2021
  111. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Aug 23, 2021
  112. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Aug 23, 2021
  113. Derrick StoleeAug 24, 2021
  114. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Aug 23, 2021
  115. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Aug 23, 2021
  116. Derrick StoleeAug 24, 2021
  117. Derrick StoleeAug 24, 2021
  118. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Aug 27, 2021
  119. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Aug 27, 2021
  120. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Aug 27, 2021
  121. Ramsay JonesAug 27, 2021
  122. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Aug 27, 2021
  123. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Sep 4, 2021
  124. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Sep 4, 2021
  125. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Sep 4, 2021
  126. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Sep 4, 2021
  127. Derrick StoleeSep 7, 2021
  128. Derrick StoleeSep 8, 2021
  129. Lénaïc HuardSep 9, 2021
  130. Derrick StoleeSep 9, 2021
  131. Ævar Arnfjörð BjarmasonSep 27, 2021
  132. Lénaïc HuardSep 27, 2021
  133. Derrick StoleeAug 17, 2021
  134. Phillip WoodAug 17, 2021
  135. Derrick StoleeAug 17, 2021
  136. Lénaïc HuardAug 18, 2021
  137. Derrick StoleeAug 18, 2021
  138. Junio C HamanoAug 18, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.