Chronyd start fails post OS installation

After installing a fresh version of RHEL9.6 on some of our DELL PowerEdge servers, I need to start up the chronyd service to do the usual time sync things. Feels like a pretty straightforward task:

- name: enable and start the chronyd
  ansible.builtin.systemd_service:
    name: "chronyd.service"
    enabled: True
    state: started

but oddly it fails claiming there is already another process for this service running.


What was there before

As in the status of the service just after the RHEL9.6 install with nothing else done to the system. Note that I am using machine.hostname as a stand-in for the actual hostname of the machine, because obvious reasons.

Via systemctl status

β—‹ chronyd.service - NTP client/server
     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; preset: enabled)
     Active: inactive (dead) since Mon 2026-02-09 23:36:36 EST; 40s ago
   Duration: 9.424s
       Docs: man:chronyd(8)
             man:chrony.conf(5)
    Process: 1439 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 1470 (code=exited, status=0/SUCCESS)
        CPU: 26ms

Feb 09 23:36:27 machine.hostname systemd[1]: Starting NTP client/server...
Feb 09 23:36:27 machine.hostname chronyd[1470]: chronyd version 4.6.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG)
Feb 09 23:36:27 machine.hostname chronyd[1470]: Loaded 0 symmetric keys
Feb 09 23:36:27 machine.hostname chronyd[1470]: Using right/UTC timezone to obtain leap second data
Feb 09 23:36:27 machine.hostname chronyd[1470]: Loaded seccomp filter (level 2)
Feb 09 23:36:27 machine.hostname systemd[1]: Started NTP client/server.
Feb 09 23:36:36 machine.hostname chronyd[1470]: chronyd exiting
Feb 09 23:36:36 machine.hostname systemd[1]: Stopping NTP client/server...
Feb 09 23:36:36 machine.hostname systemd[1]: chronyd.service: Deactivated successfully.
Feb 09 23:36:36 machine.hostname systemd[1]: Stopped NTP client/server.

The Error

Well the details about the start failure from a bunch of different places

From the ansible playbook

fatal: [machine.hostname]: FAILED! =>
    changed: false
    msg: |-
        Unable to start service chronyd.service: Job for chronyd.service failed because the control process exited with error code.
        See "systemctl status chronyd.service" and "journalctl -xeu chronyd.service" for details.

Again via systemctl status

Γ— chronyd.service - NTP client/server
     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Mon 2026-02-09 23:40:57 EST; 37s ago
   Duration: 9.424s
       Docs: man:chronyd(8)
             man:chrony.conf(5)
    Process: 8774 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=1/FAILURE)
        CPU: 26ms

Feb 09 23:40:57 machine.hostname systemd[1]: Starting NTP client/server...
Feb 09 23:40:57 machine.hostname chronyd[8776]: chronyd version 4.6.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG)
Feb 09 23:40:57 machine.hostname chronyd[8776]: Fatal error : Another chronyd may already be running (pid=3254), check /run/chrony/chronyd.pid
Feb 09 23:40:57 machine.hostname chronyd[8774]: Another chronyd may already be running (pid=3254), check /run/chrony/chronyd.pid
Feb 09 23:40:57 machine.hostname systemd[1]: chronyd.service: Control process exited, code=exited, status=1/FAILURE
Feb 09 23:40:57 machine.hostname systemd[1]: chronyd.service: Failed with result 'exit-code'.
Feb 09 23:40:57 machine.hostname systemd[1]: Failed to start NTP client/server.

Checking the journal

Feb 09 23:40:57 machine.hostname systemd[1]: Starting NTP client/server...
       Subject: A start job for unit chronyd.service has begun execution
       Defined-By: systemd
       Support: https://access.redhat.com/support

       A start job for unit chronyd.service has begun execution.

       The job identifier is 1657.
Feb 09 23:40:57 machine.hostname chronyd[8776]: chronyd version 4.6.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG)
Feb 09 23:40:57 machine.hostname chronyd[8776]: Fatal error : Another chronyd may already be running (pid=3254), check /run/chrony/chronyd.pid
Feb 09 23:40:57 machine.hostname chronyd[8774]: Another chronyd may already be running (pid=3254), check /run/chrony/chronyd.pid
Feb 09 23:40:57 machine.hostname systemd[1]: chronyd.service: Control process exited, code=exited, status=1/FAILURE
       Subject: Unit process exited
       Defined-By: systemd
       Support: https://access.redhat.com/support

       An ExecStart= process belonging to unit chronyd.service has exited.

       The process' exit code is 'exited' and its exit status is 1.
Feb 09 23:40:57 machine.hostname systemd[1]: chronyd.service: Failed with result 'exit-code'.
       Subject: Unit failed
       Defined-By: systemd
       Support: https://access.redhat.com/support

       The unit chronyd.service has entered the 'failed' state with result 'exit-code'.
Feb 09 23:40:57 machine.hostname systemd[1]: Failed to start NTP client/server.
       Subject: A start job for unit chronyd.service has failed
       Defined-By: systemd
       Support: https://access.redhat.com/support

       A start job for unit chronyd.service has finished with a failure.
      
       The job identifier is 1657 and the job result is failed.

Rerunning playbook

What is extra confusing / frustrating is that I can rerun that segment of the playbook again and the task succeeds without issue. I haven’t changed any settings, fiddle with any bits on the machine itself. Just run that playbook segment again and we get the status below afterwards.

[me@hostname ~]$ sudo systemctl status chronyd
● chronyd.service - NTP client/server
     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-02-09 23:51:23 EST; 27s ago
       Docs: man:chronyd(8)
             man:chrony.conf(5)
    Process: 9555 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 9557 (chronyd)
      Tasks: 1 (limit: 2463081)
     Memory: 3.0M
        CPU: 27ms
     CGroup: /system.slice/chronyd.service
             └─9557 /usr/sbin/chronyd -F 2

Feb 09 23:51:23 machine.hostname systemd[1]: Starting NTP client/server...
Feb 09 23:51:23 machine.hostname chronyd[9557]: chronyd version 4.6.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG)
Feb 09 23:51:23 machine.hostname chronyd[9557]: Loaded 0 symmetric keys
Feb 09 23:51:23 machine.hostname chronyd[9557]: Using right/UTC timezone to obtain leap second data
Feb 09 23:51:23 machine.hostname chronyd[9557]: Frequency 0.000 +/- 1000000.000 ppm read from /var/lib/chrony/drift
Feb 09 23:51:23 machine.hostname chronyd[9557]: Loaded seccomp filter (level 2)
Feb 09 23:51:23 machine.hostname systemd[1]: Started NTP client/server.

Thoughts (for what they are worth)

I realize this may be more of a chronyd or generic NTP server issue than an Ansible problem but I cannot find any info either way. Also was concerned that if this was a problem with the ansible.builtin.systemd_service module, it would impact other services I and anyone else needs to configure to make their systems work properly.

Machine & Software information

Ansible target hosts

Manufacturer: Dell
Model: PowerEdge R640
OS: RHEL 9.6
Kernel: Linux 5.14.0-570.12.1
Python: 3.12
chronyd: 4.6.1
systemd: 252-51.el9

Ansible controller

Python: 3.12
Ansible: 11.6.0
Ansible-core: 2.18.6

Have you tried to manually reproduce the problem? Like, login to the server after the first boot and:

  • check if chronyd is already running
  • check if there is /run/chrony/chronyd.pid
  • if not running, can you manually start it - systemctl start chronyd

What comes to my mind is that maybe Ansible connects to the host as soon as SSH is available but at that point chronyd is maybe not yet started or in a process of starting. It should be started by default on all fresh installations. Anyway, maybe Ansible tries to start it while its is already starting and there is some overlap.

Thinking again, systemd should be able to handle race conditions like these but maybe something is not working as intended.

1 Like

A missing or incorrect access rights of the configuration file /etc/chrony.conf comes into my mind here. Can you check if the files is available, has correct access rights, as well a correct syntax?