Often they try to put in place an automated sprinkler system, as it were, writing monitor scripts in various languages and running them from cron. I have wrestled with the task of writing generalized scripts to monitor or deal with the many problem situations that crop up so much of the time. Operating systems and individual machines differ in large and small ways. You either have to maintain several different versions of each script, else employ logic-obscuring switch structures and litter your code with case statements. The process is fragile and error-prone.
Scripts can flounder for dozens of other reasons besides.
The programming is just too difficult, or not worth the effort. In many traditional scripting languages, powerful and general to be sure but also perhaps too low-level, doing the most common thing is often needlessly difficult or obscure. With the prospect of writing, debugging, and maintaining code so daunting, many programs are deemed just not worth doing. The process is time-consuming and repetitive. Visiting machines one by one is unavoidable if you need to adjust cron timings or add, delete, or modify commands in crontab.