SystemD is the newer alternative to the init.d system. Instead of service files being in /etc/init.d/, they are in /lib/systemd/system. In /etc/systemd/system/multi-user.target.wants/ there are symlinks to the /lib/systemd/system service files. Anything in the multi-user target gets launched on boot (in the order specified with all of the After and Before markings in each service file. SystemD is smart enough to figure the order out.)
Here is my systemd files for these services. Note that as time goes on these might needs tweaking. Also they might need tweaking to adjust for your system. Things to adjust would be the user,group and paths and also priorities. You could comment out the user & group labels like I did, if you simply want root to launch them (which in my case I do). Also you could comment out the priority labels if you just want everything to run normal. In my case I wanted these services to have less priority than the rest of the system. The downloading services like uTorrent & Transmission & NZBget, get a slightly better priority, but still lower than the system.
NOTE: when I use the word priority below, I mean literally a higher priority (more CPU usage). linux flips the concept sometimes and higher Priority number usually mean less CPU usage. You can tell my “priority” apart from linux “Priority” because they capitalize it and I dont.
NOTE ON NICE – this sets how used the CPU is: Nice works just like “Nice” and it works on CPU priorities. -20 is highest priority, and +19 is lowest cpu priority. I gave a 10 to downloaders and 15 to the other ones. By default system puts everything at a 0.
NOTE ON IO PRIORITYS – this sets how used the data drives are: IOSchedulingClass (like -c from ionice) and IOSchedulingPriority (like -n from ionice) are just like “ionice”. IOSchedulingClass is the -c option with ionice, and IOSchedulingPriority is the -n option. IOSchedulingClass=1, ionice -c1, is the best priority (realtime priority). IOSchedulingClass=3, ionice -c3 program1, is the worse priority (waits for the device to be unused). IOSchedulingClass=2, ionice -c2 -n# program1, is the middle priority and it has 8 settings for setting the IOSchedulingPriority from 0 to 8 (which you substitute inplace of the #). IOSchedulingClass=2 & IOSchedulingPriority=0, ionice -c2 -n0 program1, has the highest priorty in this middle class. IOSchedulingClass=2 & IOSchedulingPriority=0, ionice -c2 -n0 program1, has the lowest priorty in this middle class . With -c1 and -c3 you dont need to set a -n option, in otherwords with IOSchedulingClass=1 or 3 you dont need to set IOSchedulingPriority. However with IOSchedulingClass=2 you do need to set the IOSchedulingPriority either between 0 or 7 (inclusive) – note maybe you dont need to explicitly set IOSchedulingPriority with class 2 and the system might pick something like -n0 by default. NOTE: program1 is just an example of a program, so that you can see ionice usage.
# from: http://www.freedesktop.org/software/systemd/man/systemd.exec.html Nice= Sets the default nice level (scheduling priority) for executed processes. Takes an integer between -20 (highest priority) and 19 (lowest priority). See setpriority(2) for details. IOSchedulingClass= Sets the IO scheduling class for executed processes. Takes an integer between 0 and 3 or one of the strings none, realtime, best-effort or idle. See ioprio_set(2) for details. IOSchedulingPriority= Sets the IO scheduling priority for executed processes. Takes an integer between 0 (highest priority) and 7 (lowest priority). The available priorities depend on the selected IO scheduling class (see above). See ioprio_set(2) for details.
MORE on NICE and IONICE here: http://www.infotinks.com/ionice/
The SYSTEMD Files
NOTE: im not the systemd expert however I have read up about it and have adjusted my service files for the best.
NOTE: if your not using a ReadyNAS 6.x you can change After=apache2.service readynasd.service to After=network.target. These After labels / clauses are read during boot up, and it launches all of the “multi-user-wants” service files in order thanks to these After and Before clauses (we dont use any Befores, but other service files do). We want these services to be started after the network comes up, so by default we would want them to say After=network.target. However since im using a ReadyNAS 6.x i want them to come up after the volume comes up (as the volumes holds the /apps subvolume). The volume comes up after readynasd.service. I know for a fact too that once apache2 and readynasd come up everything in the system is up and running including the network and the volumes, so as a safety precaution I just have these services start up after apache & readynasd. This alike to saying I want these services to start up last in the boot order. the network.target service file is pretty minimal it only exists as a systemd service to tell other service if the network is up (for use with After/Before etc.)
NOTE: I use the After label to make sure these services start after the network starts. I saw DaemonAfter in some example Service files. I couldnt find any documentation about it. Eitherway I know that After works just as well, so thats what we I will use.
NOTE: We use Type=forking because these are daemons, meaning they fork off and the first/parent PID is not the daemons pid. So Type has to be set to forking. There is a way you can do these with Type=simple you would have to use bash with the ExecStart i.e. http://forum.utorrent.com/topic/92258-installing-utorrent-for-debian-7-systemd-integration/. I like my method better. Also my method returns pretty output with systemctl status. Since these are Daemons its best to find out its PID by using PIDFile (a pid file is a text file that has the PID of the daemon, it is created when you start a daemon, usually into the /var/run folder, however you can change that up with apps, for example my utservers pid file goes right into /apps/ut/pid)
NOTE: the transmission service file is not actually called transmission.service on my system, its called fvapp-transmissionr6.service because its one of the installable addon/apps that come with the ReadyNAS6.x. I assume not all people that come across this page will be using a ReadyNAS so I changed the name to something more applicable to everyone.
NOTE: comments are done with # just like with bash scripts.
NOTE: User & Group are a good idea to use, but I didnt so I just comment them out.
[Unit] Description=uTorrent Server After=network.target # DaemonAfter=readynasd.service # If your using ReadyNAS comment out above "After=network.target" and uncomment below. # After=apache2.service readynasd.service [Service] # User=utserver # Group=utserver ExecStart=/apps/ut/utserver -daemon -configfile /apps/ut/config.txt -settingspath /apps/ut -logfile /apps/ut/log.txt -pidfile /apps/ut/pid Type=forking PIDFile=/apps/ut/pid # -- added below to be less priority -- # Nice=10 IOSchedulingClass=2 IOSchedulingPriority=2 [Install] WantedBy=multi-user.target
[Unit] Description=SickBeard Daemon After=network.target # DaemonAfter=readynasd.service # If your using ReadyNAS comment out above "After=network.target" and uncomment below. # After=apache2.service readynasd.service [Service] # User=sickbeard # Group=sickbeard Type=forking GuessMainPID=no ExecStart=/usr/bin/python2.7 /apps/sickrage/SickBeard.py -q --daemon --nolaunch # -- added below to be less priority -- # Nice=15 IOSchedulingClass=2 IOSchedulingPriority=5 [Install] WantedBy=multi-user.target
[Unit] Description=CouchPotato Daemon After=network.target # DaemonAfter=readynasd.service # If your using ReadyNAS comment out above "After=network.target" and uncomment below. # After=apache2.service readynasd.service [Service] # User=couchpotato # Group=couchpotato ExecStart=/apps/cpot/CouchPotato.py --daemon GuessMainPID=no Type=forking # -- added below to be less priority -- # Nice=15 IOSchedulingClass=2 IOSchedulingPriority=5 [Install] WantedBy=multi-user.target
[Unit] Description=Service for transmission After=network.target # If your using ReadyNAS comment out above "After=network.target" and uncomment below. # After=apache2.service readynasd.service [Service] # User=transmission # Group=transmission Type=forking ExecStart=/etc/init.d/transmission start ExecStop=/etc/init.d/transmission stop PIDFile=/var/run/transmission-daemon.pid Restart=always # -- added below to be less priority -- # Nice=10 IOSchedulingClass=2 IOSchedulingPriority=2 [Install] WantedBy=multi-user.target
[Unit] Description=NZBGet Daemon After=network.target # This will load nzbget only after setting up the readynasd.service (usually you put network.target here) # DaemonAfter=readynasd.service # If your using ReadyNAS comment out above "After=network.target" and uncomment below. # After=apache2.service readynasd.service [Service] # User=root # Group=root Type=forking # -s server mode -D daemon mode ExecStart=/apps/nzbget/nzbget -D ExecStop=/apps/nzbget/nzbget -Q ExecReload=/bin/kill -HUP $MAINPID KillMode=process # -- added below to be less priority -- # Nice=10 IOSchedulingClass=2 IOSchedulingPriority=2 [Install] # Needed to run nzbget at boot WantedBy=multi-user.target
Here are examples of how you would use these with a systemctl command, however first make sure you have created the files and that they have the .service extension. My examples will use CouchPotato as an example which I made /lib/systemd/system/cpot.service. Note that I can refer to it as cpot or cpot.service with systemctl. So ill use cpot to type less.
To enable a service on boot (so it doesnt launch on boot – you will notice this simply creates a symlink): systemctl enable cpot
To disable a service on boot (you will notice this simply removes that symlink): systemctl disable cpot
To start the program/service now: systemctl start cpot
To stop the program/service now: systemctl stop cpot
To see if its running (along with other info, like if its enabled for boot, and its process info and some logs): systemctl status cpot
NOTE: if you have edited any of the service files that you have used already then you will need to run this for systemd to read the services files and cache them: systemctl –system daemon-reload