How to run a shell script at startup

Linuxnode.jsinit.dForever

Linux Problem Overview


On an Amazon S3 Linux instance, I have two scripts called start_my_app and 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.

Linux Solutions


Solution 1 - Linux

Set a crontab for this

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

after every startup it will run the test script.

Solution 2 - Linux

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

Solution 3 - Linux

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

/PATH/TO/MY_APP &

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.

Solution 4 - Linux

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 /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.

Solution 5 - Linux

Enter cron using sudo:

sudo crontab -e

Add a command to run upon start up, in this case a script:

@reboot sh /home/user/test.sh

Save:

Press ESC then :x to save and exit, or hit ESC then ZZ (that's shift+zz)

Test Test Test:

  1. Run your test script without cron to make sure it actually works.

  2. Make sure you saved your command in cron, use sudo crontab -e

  3. Reboot the server to confirm it all works sudo @reboot

Solution 6 - Linux

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:

crontab -e

Line you have to add:

@reboot  /path_to_you_file/your_file

That simple!

Solution 7 - Linux

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.

Solution 8 - Linux

Edit the rc.local file using nano or gedit editor and add your scripts in it. File path could be /etc/rc.local or /etc/rc.d/rc.local.

sudo nano /etc/rc.local

This is the edit:

#!/bin/sh
/path-to-your-script/your-scipt-name.sh

once done press ctrl+o to update, pressEnter then ctrl+x.

Make the file executable.

sudo chmod 755 /etc/rc.local

Then initiate the rc-local service to run script during boot.

sudo systemctl start rc-local

Solution 9 - Linux

You can do it :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

then use this command

update-rc.d start_my_app defaults 100

Please see this page on Cyberciti.

Solution 10 - Linux

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)

Solution 11 - Linux

This simple solution worked for me on an Amazon Linux instance running CentOS. Edit your /etc/rc.d/rc.local file and put the command there. It is mentioned in this file that it will be executed after all other init scripts. So be careful in that regards. This is how the file looks for me currently.enter image description here. Last line is the name of my script.

Solution 12 - Linux

Create your own /init executable

This is not what you want, but it is fun!

Just pick an arbitrary executable file, even a shell script, and boot the kernel with the command line parameter:

init=/path/to/myinit

Towards the end of boot, the Linux kernel runs the first userspace executable at the given path.

Several projects provide popular init executables used by major distros, e.g. systemd, and in most distros init will fork a bunch of processes used in normal system operation.

But we can hijack /init it to run our own minimal scripts to better understand our system.

Here is a minimal reproducible setup: <https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init>

Solution 13 - Linux

Many answers on starting something at boot, but often you want to start it just a little later, because your script depends on e.g. networking. Use at to just add this delay, e.g.:

at now + 1 min -f /path/yourscript

You may add this in /etc/rc.local, but also in cron like:

# crontab -e
@reboot at now + 1 min -f /path/yourscript

Isn't it fun to combine cron and at? Info is in the man page man at.

As for the comments that @reboot may not be widely supported, just try it. I found out that /etc/rc.local has become obsolete on distros that support systemd, such as ubuntu and raspbian.

Solution 14 - Linux

multi ways to finish it:

  1. crontab
  2. rc.local
  3. init.d
  4. systemd

Solution 15 - Linux

I refered to this blog, always sound a good choice

https://blog.xyzio.com/2016/06/14/setting-up-a-golang-website-to-autorun-on-ubuntu-using-systemd/

vim /lib/systemd/system/gosite.service

Description=A simple go website
ConditionPathExists=/home/user/bin/gosite
 
[Service]
Restart=always
RestartSec=3
ExecStart=/home/user/bin/gosite
 
[Install]
WantedBy=multi-user.target

systemctl enable gosite.service

Solution 16 - Linux

For Debian 9 see https://askubuntu.com/questions/228304/how-do-i-run-a-script-at-start-up. It is helped me. Short version for Debian 9: add commands (as root) to /etc/rc.local

/path_to_file/filename.sh ||  exit 1   # Added by me
exit 0

Probably, /path_to_file/filename.sh should be executable (I think so).

Solution 17 - Linux

In Lubuntu I had to deal with the opposite situation. Skype start running after booting and I found in ~/.config/autostart/ the file skypeforlinux.desktop. The content of the file is as follows:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

Deleting this file helped me.

Solution 18 - Linux

Here is a simpler method!

First: write a shell script and save it a .sh here is an example

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

this script will disable the internal keyboard at startup.

Second: Open the application " Startup Application Preferences"

enter image description here

enter image description here

Third: click Add. fourth: in the NAME section give a name. fifth: In the command section browse to your .sh . sixth: edit your command section to:

bash <space> path/to/file/<filename>.sh <space> --start

seventh: click Add. Thats it! Finished!

Now confirm by rebooting your pc.

cheers!

Solution 19 - Linux

  • Add your script to /etc/init.d/ directory
  • Update your rc run-levels: $ update-rc.d myScript.sh defaults NN where NN is the order in which it should be executed. 99 for example will mean it would be run after 98 and before 100.

Solution 20 - Linux

Painless, easiest and the most universal method is simply executing it with ~.bash_profile or ~.profile (if you don't have bash_profile file).

Just add the execution command at the bottom of that file and it will be executed when system started.

I have this one at the bottom an example; ~\Desktop\sound_fixer.sh

Solution 21 - Linux

Working with Python 3 microservices or shell; using Ubuntu Server 18.04 (Bionic Beaver) or Ubuntu 19.10 (Eoan Ermine) or Ubuntu 18.10 (Cosmic Cuttlefish) I always do like these steps, and it worked always too:

  1. Creating a microservice called p example "brain_microservice1.service" in my case:

     $ nano /lib/systemd/system/brain_microservice1.service
    
  2. Inside this new service that you are in:

     [Unit]
     Description=brain_microservice_1
     After=multi-user.target
    
     [Service]
     Type=simple
     ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
     ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
     ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
     PrivateTmp=true
     LimitNOFILE=infinity
     KillMode=mixed
     Restart=on-failure
     RestartSec=5s
    
     [Install]
     WantedBy=multi-user.target
    
  3. Give the permissions:

     $ chmod -X /lib/systemd/system/brain_microservice*
     $ chmod -R 775 /lib/systemd/system/brain_microservice*
    
  4. Give the execution permission then:

     $ systemctl daemon-reload
    
  5. Enable then, this will make then always start on startup

     $ systemctl enable brain_microservice1.service
    
  6. Then you can test it;

    $ sudo reboot now

  7. Finish = SUCCESS!!

This can be done with the same body script to run shell, react ... database startup script ... any kind os code ... hope this help u...

...

Solution 22 - Linux

For some people, this will work:

You could simply add the following command into SystemPreferencesStartup Applications:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmeetamitView Question on Stackoverflow
Solution 1 - LinuxHemant kumarView Answer on Stackoverflow
Solution 2 - LinuxJonathan MullerView Answer on Stackoverflow
Solution 3 - LinuxGilles QuenotView Answer on Stackoverflow
Solution 4 - LinuxSauleView Answer on Stackoverflow
Solution 5 - Linuxuser3140639View Answer on Stackoverflow
Solution 6 - LinuxLuciano GhilarducciView Answer on Stackoverflow
Solution 7 - LinuxchrisView Answer on Stackoverflow
Solution 8 - LinuxDohdView Answer on Stackoverflow
Solution 9 - LinuxIR PROView Answer on Stackoverflow
Solution 10 - LinuxfieldsweeperView Answer on Stackoverflow
Solution 11 - LinuxshshnkView Answer on Stackoverflow
Solution 12 - LinuxCiro Santilli Путлер Капут 六四事View Answer on Stackoverflow
Solution 13 - LinuxRolandView Answer on Stackoverflow
Solution 14 - LinuxridoxView Answer on Stackoverflow
Solution 15 - Linux王子1986View Answer on Stackoverflow
Solution 16 - LinuxMikhail IonkinView Answer on Stackoverflow
Solution 17 - LinuxaerijmanView Answer on Stackoverflow
Solution 18 - Linuxakbar aliView Answer on Stackoverflow
Solution 19 - LinuxKibrom GebreView Answer on Stackoverflow
Solution 20 - LinuxJukoView Answer on Stackoverflow
Solution 21 - LinuxRenan MouraView Answer on Stackoverflow
Solution 22 - LinuxSagarSaveView Answer on Stackoverflow