Progressive Hints¶
Hint 1 (after 5 min)¶
Exit code 126 is different from 127. Code 127 means "command not found." Code 126 means "permission denied" — the file exists but cannot be executed. Look at the file permissions in the ls -la output.
Hint 2 (after 10 min)¶
The Ansible task that deploys the script sets mode: "0644" — that is rw-r--r--, which has no execute bit. The Ansible playbook ran yesterday at 18:45 (visible in the log lines), which was after the last successful run at 02:00. So the file was redeployed without execute permission between successful runs.
Hint 3 (after 15 min)¶
This is a nightly batch data export system. The data-exporter service runs /opt/data-exporter/bin/export.sh to export transaction and user event data (millions of rows). It ran successfully at 02:00 on Oct 1. Then at 18:45, someone ran the Ansible playbook which redeployed the script with 0644 permissions (no execute bit). When the service tried to run at 02:00 on Oct 2, systemd could not execute the script — exit code 126. The cron job for cleanup.sh is unrelated.