How do I know if systemctl daemon-reload needs to be run

You can check loaded unit by command systemctl show <unit>.service. As far I know there is no tool to check changes in unit files.

As well you could run this bash command for var in $(systemctl | grep running | awk '{print $1}'); do systemctl status $var | grep "changed on disk" | grep ".service"; done it would show what files has been changed.

Example:

[root@centos-linux atolkachev]# for var in $(systemctl | grep running | awk '{print $1}'); do systemctl status $var | grep "changed on disk" | grep ".service"; done
Warning: nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.

systemd doesn't provide out of the box support for displaying changed unit files, but you can use a bash script like this:

while read unit; do
    systemctl status $unit 2>&1 | awk '/changed on disk/ {print $2}'
done< <(systemctl list-unit-files | grep \.service | awk '{print $1}')

This line will do systemctl daemon-reload if needs to be run:

for service in $(systemctl | grep running | grep .service | awk '{print $1}'); do ! test "$mayreload" && systemctl status $var 2>&1 | grep -q "changed on disk" && && mayreload=1 && echo reloading systemctl && systemctl daemon-reload ; done