1. Проверьте бит исполнения (x) на скрипте ~/backup.sh командой
ls -la ~/backup.sh
если нет бита execute (x), то ставьте:
chmod a+x ~/backup.sh
2. Проверьте логи cron
cat /var/log/syslog | grep CRON | grep backup.sh
3. Всегда! Повторяю, Всегда указывайте полный путь к запускаемому скрипту, то есть
@midnight bash /full/path/backup.sh >/var/log/backup.log 2>&1
4. Рекомендую организовать вывод отладочной информации и обработку ошибок в лог на уровне скрипта, а в crontab писать конструкцию:
@midnight bash /full/path/backup.sh >/dev/null 2>&1
чтобы перенаправить все потоки вывода и ошибок в /dev/null
если вы напишите конструкцию вида
@midnight bash /full/path/backup.sh >/dev/null
то только поток вывода будет перенаправлен в /dev/null, если произойдет ошибка выполнения скрипта, то cron уведомит пользователя root на email (при условии правильной настройки рассылки на сервере)