Both. Terminal, and some sort of automation. With Ansible, there's awx and semaphore. I think someone mentioned cronjobs, also systemd-timers. I think kubernetes has a cronjobs feature as well.
I usually have cron jobs set up on servers for simple things.
If I'm doing large scale web development, I tend to use containers, so I'll use a scheduling mechanism appropriate for whatever framework I'm using. For example, if I'm building a Django application, then I use Celery.
There's always the tradeoff of just using the tools you get for free in a Linux distro, but paying the price of handling multiple DSLs, versus installing, configuring, and managing a larger system with a more homogenous interface.