Since Debian Jessie, the old init program has been replace by systemd.
Check it out yourself. Run: ls -l /sbin/init and see what it's pointing to. These days it points to systemd (/sbin/init -> /lib/systemd/systemd), a newer and better initialization program.
SO THE CHOSEN AND OTHER ANSWERS HERE ARE NOW OUTDATED
*While you can still install scripts the old way with System-V tools, it's not a good idea generally speaking.
man systemd.service says:*
If a service is requested under a certain name but no unit configuration file is found, systemd looks for a SysV init script by
the same name ... and dynamically creates a service unit from that
script. This is useful for compatibility with SysV. Note that this
compatibility is quite comprehensive but not 100%.
For newer Debian systems (i.e. Jessie, Stretch, Buster, etc...)
It's easier than you think. (-:
Here's the new and preferred method to install boot-up or shutdown programs.
With systemd you first want to create a unit file. A unit file is mostly declarations, not code.
Then you'll use the systemctl command to enable or start that unit.
systemd does much of the work for you, making it easy, for example, to have a critical program automatically re-start if it crashes or is otherwise killed. Also it shuts down your program where and when it should by default with no extra work on your part.
man systemd.unit -- About unit files in general man systemd.service -- About service unit files, e.g. daemons, and single run programs.
man systemctl -- Command line user interface man journalctl -- View log of what systemd has done
man systemd -- About the init program itself
There are also a variety of other types of unit files, e.g.
man systemd.target - for groups and common synced targets.
Once you've digested the basics above, then dig in with man -k systemd to find other related man pages.
Whatever you do, on Debian do not use any of these:
update-rc.d --install and remove System-V style init script links
sysv-rc-conf -- Run-level configuration for SysV like init script links
runlevel -- Print previous and current SysV runlevel
BUM -- Boot Up Manager - a graphical runlevel editor
systemadm -- Graphical frontend for the systemd system and service manager
(BTW, the author told me by email that it's too broken now.)
AN EXAMPLE:
This unit file starts up the NoIP.com daemon when I boot-up, and shuts it down when I shutdown.
This daemon, from time to time, sends my current IP address to update my DDNS (Dynamic DNS (Domain Name Server)) provider's data base, thus keeping my domain name pointing at my computer wherever it travels to.
This unit files is located on my system in this settings file: /etc/systemd/system/noip2.service
Here's what's in the unit file:
# Comments can only go at the beginning of the line!
[Unit]
Description=Start the NoIP IP update daemon. This runs every 30 minutes and reports our current IP to NoIP.com to update Love2d.ddns.net.
Documentation=https://no-ip.com/
Documentation=file:///nobak/Installers/NoIP/noip-2.1.9-1/README.FIRST
[Service]
# 'forking' because process returns after starting daemon (traditional unix daemon).
Type=forking
# This program runs and returns, leaving the running daemon
ExecStart=/usr/local/bin/noip2
# Be in no hurry to start this. Max nice is +19.
Nice=15
# If it dies for any reason, then restart it
Restart=always
[Install]
# Installs a hook to use this unit file when the system boots or shuts down
WantedBy=multi-user.target
Manually run a unit file, (e.g. for testing):
start with $ sudo systemctl start noip2.
restart with $ sudo systemctl restart noip2.
stop with $ sudo systemctl stop noip2.
Configure system to automatically run a unit file when starting up or shutting down:
You can call your script from /etc/rc.local, prior to the line that says exit 0
As for shutting down your app, I would suggest putting a script in /etc/rc0.d. You need to name it with an uppercase K, and then a 2 digit number which specifies the order these scripts are run, and then a name. It will be called with a parameter "stop", but you can ignore this for a simple stop script.
For shutdown, create a link / copy your script into one of the /etc/rcX.d folders where X is the runlevel that you want it to execute at. 0 is the shutdown runlevel for Debian I believe.
The easiest is to modify existing scripts, works in my system, used for sounds :)
startup, modify /etc/init.d/rc.local, add your sh at the end of the file, before :
(it will execute it right before login "screen")
shutdown, modify /etc/init.d/halt, add your sh at the beginning of the file, just after initial comments
(it will be executed before actual shutdown command, that is called by this script file
reboot, same as shutdown, but in /etc/init.d/reboot
On Debian, service & application boot and shutdown scripts should be placed into
/etc/init.d/
.Debian provides an example script
/etc/init.d/skeleton
that you can modify to your taste for your particular application.Once it's in place, call:
To have Debian add the
/etc/rc?.d/
symlinks for you.If you prefer a menu or graphical interface, take a look at the
sysv-rc-conf
orksysv
package.Since Debian Jessie, the old
init
program has been replace bysystemd
.Check it out yourself. Run:
ls -l /sbin/init
and see what it's pointing to. These days it points tosystemd
(/sbin/init -> /lib/systemd/systemd
), a newer and better initialization program.SO THE CHOSEN AND OTHER ANSWERS HERE ARE NOW OUTDATED
*While you can still install scripts the old way with System-V tools, it's not a good idea generally speaking.
man systemd.service
says:*For newer Debian systems (i.e. Jessie, Stretch, Buster, etc...)
It's easier than you think. (-:
Here's the new and preferred method to install boot-up or shutdown programs.
With
systemd
you first want to create a unit file. A unit file is mostly declarations, not code.Then you'll use the
systemctl
command to enable or start that unit.systemd
does much of the work for you, making it easy, for example, to have a critical program automatically re-start if it crashes or is otherwise killed. Also it shuts down your program where and when it should by default with no extra work on your part.Start to learn about
systemd
here:From Debian and elsewhere and etc and etc.
Man pages to start with:
man systemd.unit
-- About unit files in generalman systemd.service
-- About service unit files, e.g. daemons, and single run programs.man systemctl
-- Command line user interfaceman journalctl
-- View log of what systemd has doneman systemd
-- About the init program itselfThere are also a variety of other types of unit files, e.g.
man systemd.target
- for groups and common synced targets.Once you've digested the basics above, then dig in with
man -k systemd
to find other related man pages.Whatever you do, on Debian do not use any of these:
update-rc.d
--install and remove System-V style init script linkssysv-rc-conf
-- Run-level configuration for SysV like init script linksrunlevel
-- Print previous and current SysV runlevelBUM
-- Boot Up Manager - a graphical runlevel editorsystemadm
-- Graphical frontend for the systemd system and service manager(BTW, the author told me by email that it's too broken now.)
AN EXAMPLE:
This unit file starts up the NoIP.com daemon when I boot-up, and shuts it down when I shutdown.
This daemon, from time to time, sends my current IP address to update my DDNS (Dynamic DNS (Domain Name Server)) provider's data base, thus keeping my domain name pointing at my computer wherever it travels to.
This unit files is located on my system in this settings file:
/etc/systemd/system/noip2.service
Here's what's in the unit file:
Manually run a unit file, (e.g. for testing):
$ sudo systemctl start noip2
.$ sudo systemctl restart noip2
.$ sudo systemctl stop noip2
.Configure system to automatically run a unit file when starting up or shutting down:
$ sudo systemctl enable noip2
.$ sudo systemctl disable noip2
.View log
$ sudo journalctl -u noip2
You can call your script from /etc/rc.local, prior to the line that says exit 0
As for shutting down your app, I would suggest putting a script in /etc/rc0.d. You need to name it with an uppercase K, and then a 2 digit number which specifies the order these scripts are run, and then a name. It will be called with a parameter "stop", but you can ignore this for a simple stop script.
For startup have a look at this.
For shutdown, create a link / copy your script into one of the /etc/rcX.d folders where X is the runlevel that you want it to execute at. 0 is the shutdown runlevel for Debian I believe.
The easiest is to modify existing scripts, works in my system, used for sounds :)
/etc/init.d/rc.local
, add your sh at the end of the file, before : (it will execute it right before login "screen")/etc/init.d/halt
, add your sh at the beginning of the file, just after initial comments (it will be executed before actual shutdown command, that is called by this script file/etc/init.d/reboot