How to run a shell script at startup
On an Amazon S3 Linux instance, I have two scripts called
stop_my_app which start and stop forever (which in turn runs my Node.js application). I use these scripts to manually start and stop my Node.js application. So far so good.
My problem: I also want to set it up such that
start_my_app is run whenever the system boots up. I know that I need to add a file inside
init.d and I know how to symlink it to the proper directory within
rc.d, but I can't figure out what actually needs to go inside the file that I place in
init.d. I'm thinking it should be just one line, like,
start_my_app, but that hasn't been working for me.
In the file you put in
/etc/init.d/ you have to set it executable with:
chmod +x /etc/init.d/start_my_app
Thanks to @meetamit, if this does not run you have to create a symlink to
ln -s /etc/init.d/start_my_app /etc/rc.d/
Please note that on latest Debian, this will not work as your script have to be LSB compliant (provide, at least, the following actions: start, stop, restart, force-reload, and status): https://wiki.debian.org/LSBInitScripts
As a note, you should put the absolute path of your script instead of a relative one, it may solves unexpected issues:
And don't forget to add on top of that file:
Set a crontab for this
#crontab -e @reboot /home/user/test.sh
after every startup it will run the test script.
Read more... Read less...
A simple approach is to add a line in
or if you want to run the command as a special user :
su - USER_FOOBAR -c /PATH/TO/MY_APP &
(the trailing ampersand backgrounds the process and allows the rc.local to continue executing)
If you want a full init script, debian distro have a template file, so :
cp /etc/init.d/skeleton /etc/init.d/your_app
and adapt it a bit.
This is the way I do it on Red Hat Linux systems.
Put your script in
/etc/init.d, owned by root and executable. At the top of the script, you can give a directive for
chkconfig. Example, the following script is used to start a Java application as user oracle.
The name of the script is
#!/bin/bash # chkconfig: 345 99 10 # Description: auto start apex listener # case "$1" in 'start') su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";; 'stop') echo "put something to shutdown or kill the process here";; esac
This says that the script must run at levels 3, 4, and 5, and the priority for start/stop is 99 and 10.
Then, as user
root you can use
chkconfig to enable or disable the script at startup:
chkconfig --list apex chkconfig --add apex
And you can use
service start/stop apex.
sudo crontab -e
Add a command to run upon start up, in this case a script:
@reboot sh /home/user/test.sh
Press ESC then :x to save and exit, or hit ESC then ZZ (that's shift+zz)
Test Test Test:
Run your test script without cron to make sure it actually works.
Make sure you saved your command in cron, use
sudo crontab -e
Reboot the server to confirm it all works
Just have a line added to your crontab..
Make sure the file is executable:
chmod +x /path_to_you_file/your_file
To edit crontab file:
Line you have to add:
Another option is to have an @reboot command in your crontab.
Not every version of cron supports this, but if your instance is based on the Amazon Linux AMI then it will work.