How to run a shell script at startup

On an amazon linux instance, I have two scripts called start_my_app and stop_my_app which start and stop forever (which in turn run my node.js app). I use these scripts to manually start and stop my node app. 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 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.

Any help would be appreciated. Thanks.

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 /etc/rc.d/

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:

/var/myscripts/start_my_app

And don't forget to add on top of that file:

#!/bin/sh

A simple approach is to add a line in /etc/rc.local :

su - USER_FOOBAR -c /PATH/TO/MY_APP &

or if you want to run the command as root :

/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 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 /etc/init.d/apex

#!/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

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.

Set a crontab for this

#crontab -e
@reboot  /home/user/test.sh

after every startup it will run the test script.

Instead of typing:

chkconfig --add service_name

after putting script to /etc/init.d/ folder you can type:

chkconfig service_name on

The absolute easiest method if all you want to run is a simple script, (or anything) is if you have a gui to use system > preferences then startup apps.

just browse to the script you want and there you go. (make script executable)

for some people this will works You could simply add the following command into System > Preferences > Startup Applications:

bash /full/path/to/your/script.sh

if you want to put startup also you can use

first of all move your script /etc/init.d then chmod 777 /etc/init.d/your script name

after apply following command

update-rc.d your script defaults remove update-rc.d -f your script remove

at the startup you can see your app will run.