crontab @reboot does not execute bash script when server is rebooted
Categories:
Troubleshooting @reboot Crontab Entries for Bash Scripts

Learn why your @reboot crontab entry might not be executing your bash script after a server restart and how to fix it.
The @reboot directive in crontab is designed to execute a command or script once, at system startup. It's a convenient way to ensure certain services or tasks are initiated automatically without needing to manage systemd units or other init scripts. However, it's a common pitfall for users to find their @reboot entries failing to execute their bash scripts as expected. This article delves into the primary reasons for these failures and provides comprehensive solutions to ensure your scripts run reliably after every reboot.
Understanding the @reboot Environment
When a script is executed via @reboot, it runs in a very minimal environment. This environment often lacks crucial PATH variables, user-specific configurations, and even a fully initialized network stack that might be present when you manually run the script or when other cron jobs execute later. This difference in environment is the most frequent cause of unexpected behavior.
flowchart TD
A[Server Reboots] --> B{Crontab @reboot Triggered}
B --> C[Script Execution Attempt]
C --> D{Minimal Environment?}
D -- Yes --> E[Common Failures: PATH, Permissions, Network]
D -- No --> F[Script Runs Successfully]
E --> G[Troubleshooting Steps]
G --> H[Solution: Full Paths, Environment, Logging]Flowchart of @reboot script execution and common failure points.
Common Causes and Solutions
Several factors can prevent an @reboot script from running correctly. Addressing these systematically will help you diagnose and resolve the issue.
crontab. Ensure it runs correctly from the command line, especially from a fresh shell session, to rule out basic syntax or logic errors.1. Incomplete PATH and Environment Variables
Scripts often rely on commands or binaries located in directories that are not part of the default PATH in the @reboot environment. Similarly, environment variables that your script expects might not be set.
# Incorrect (relies on PATH)
@reboot myscript.sh
# Correct (uses full path)
@reboot /home/user/bin/myscript.sh
# Correct (explicitly sets PATH within crontab)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
@reboot /home/user/bin/myscript.sh
Example of using full paths and setting PATH in crontab.
To resolve this, use absolute paths for all commands and scripts within your crontab entry or the script itself. Alternatively, you can define a PATH variable directly within your crontab file. For more complex environment needs, source your user's profile or environment file within the script.
# In myscript.sh
#!/bin/bash
# Source user's bash profile for environment variables
source /home/user/.bashrc
# Now, commands like 'node' or 'python' might be found
/usr/bin/node /path/to/my/app.js >> /var/log/my_app.log 2>&1
Sourcing .bashrc within a script to load environment variables.
2. Permissions and Ownership Issues
Ensure your script has execute permissions and that the user whose crontab it is (usually the user who created it, or root) has permission to read and execute the script and access any files or directories it interacts with.
chmod +x /path/to/your/script.sh
Granting execute permissions to a script.
3. Network or Service Dependencies
If your script requires network access or depends on other services (like a database or web server) that might not be fully initialized at the exact moment @reboot fires, it will fail. @reboot executes very early in the boot process.
A common workaround is to introduce a delay at the beginning of your script to allow services to start up. For more robust solutions, consider using systemd services with proper dependency management.
# In myscript.sh
#!/bin/bash
sleep 30 # Wait for 30 seconds for network/services to initialize
# Now execute commands that require network or other services
wget -O /tmp/test.html http://example.com >> /var/log/wget.log 2>&1
Adding a delay to a script to wait for network/service initialization.
4. Lack of Logging and Error Handling
Without proper logging, it's impossible to know why a script failed. Redirecting stdout and stderr to a log file is crucial for debugging @reboot issues.
@reboot /path/to/your/script.sh >> /var/log/my_reboot_script.log 2>&1
Redirecting script output and errors to a log file.
Check the specified log file after a reboot to see any error messages or output from your script. This is often the fastest way to pinpoint the problem.
5. User Crontab vs. System Crontab
Most users edit their own crontab using crontab -e. This runs jobs as the user who owns the crontab. If your script needs root privileges, you should either use sudo within the script (with caution) or add the entry to the root user's crontab (sudo crontab -e). For system-wide scripts, /etc/crontab or files in /etc/cron.d/ are also options, but these require specifying the user to run the command as.
crontab or system-wide cron files, as incorrect entries can impact system stability.Debugging Steps for @reboot Failures
Follow these steps to systematically debug your @reboot script.
1. Verify Script Executability
Ensure your script has execute permissions: chmod +x /path/to/your/script.sh.
2. Use Absolute Paths
Modify your crontab entry and the script itself to use full, absolute paths for all commands and files. For example, /usr/bin/python instead of python.
3. Add Logging
Redirect stdout and stderr to a log file in your crontab entry: @reboot /path/to/your/script.sh >> /var/log/my_reboot_script.log 2>&1.
4. Check Log File After Reboot
Reboot your server and immediately check the log file (/var/log/my_reboot_script.log in the example) for any error messages or output. This is your primary source of debugging information.
5. Test Environment Variables
If the log file is empty or unhelpful, add commands to your script to log the environment it's running in: env >> /var/log/my_reboot_script.log 2>&1 and echo $PATH >> /var/log/my_reboot_script.log 2>&1. Compare this to your interactive shell's environment.
6. Introduce a Delay
If network or service dependencies are suspected, add a sleep command at the beginning of your script (e.g., sleep 30) to give the system more time to initialize.
7. Consider systemd for Complex Needs
For scripts with complex dependencies or requiring more robust management, consider converting them into systemd service units. This offers better control over startup order and dependencies.
By systematically applying these troubleshooting steps, you should be able to identify and resolve why your @reboot crontab entry is not executing your bash script as intended.