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.