Il 90% dei casi è l'ambiente: cron esegue con un PATH scheletrico (/usr/bin:/bin), senza il tuo .bashrc, senza le tue variabili. Lo script che a mano vola, sotto cron non trova docker, node o la variabile d'ambiente che dava per scontata. Le regole: percorsi assoluti per tutto (comandi e file), le variabili dichiarate nel crontab stesso o nello script, e il carattere % che in crontab va escapato (\%) – il classico che tronca i comandi con date +\%F. Per vedere cosa succede, cattura l'output che cron altrimenti disperde:
*/5 * * * * /opt/script.sh >> /var/log/mio-script.log 2>&1E per sapere se è partito: journalctl -u cron -b (o grep CRON /var/log/syslog) elenca ogni esecuzione lanciata – se lì c'è e il tuo log è vuoto, muore subito d'ambiente; se non c'è nemmeno lì, controlla la sintassi della riga. Ah: l'ultima riga del crontab vuole il newline finale, altrimenti viene ignorata in silenzio.