Auto-starting Twonky Server on Ubuntu 18.04 using systemd - linux

I was trying to set up a Twonky Server on Ubuntu. The server works fine, but I could not get systemd to autostart the server (using a service file I created at /etc/systemd/system/twonkyserver.service). Sometimes I got the cryptic error message that some PID-file (/var/run/mediaserver.pid) is not accessible, the exit code of the service is 13, which apparently is a EACCES Permission denied error . The service runs as root.
I finally managed to fix the problem by setting PIDFile in the twonkyserver.service file to /var/run/mediaserver.pid. For reference, find the service file below:
[Unit]
Description=Twonky Server Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/twonky/twonky.sh start
ExecStop=/usr/local/twonky/twonky.sh stop
ExecReload=/usr/local/twonky/twonky.sh reload
ExecRestart=/usr/local/twonky/twonky.sh restart
PIDFile=/var/run/mediaserver.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target

As described above, the below service file auto-starts the Twonky Server on boot. Simply create it using vim /etc/systemd/system/twonkyserver.service. This assumses that you have installed the Twonky Server to usr/local/twonky. The shell-file twonky.sh already provides a nice interface to the service file (twonky.sh start|stop|reload|restart, also see twonky.sh -h).
[Unit]
Description=Twonky Server Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/twonky/twonky.sh start
ExecStop=/usr/local/twonky/twonky.sh stop
ExecReload=/usr/local/twonky/twonky.sh reload
ExecRestart=/usr/local/twonky/twonky.sh restart
PIDFile=/var/run/mediaserver.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target

I would slightly amend the start and stop commands from twonky.sh and put them directly into the twonky.service file for systemd:
[Unit]
Description=Twonky Server Service
After=network.target
[Service]
Type=simple
#Systemd will ensure RuntimeDirectory for the PID file is created under /var/run
RuntimeDirectory=twonky
PIDFile=/var/run/twonky/mediaserver.pid
# use the -mspid argument for twonkystarter to put the pid file in the right place
ExecStart=/usr/local/twonky/twonkystarter -mspid /var/run/twonky/mediaserver.pid -inifile /usr/local/twonky/twonkyserver.ini -logfile /usr/local/twonky/twonky.log -appdata /usr/local/twonky
ExecStop=kill -s TERM $MAINPID
ExecStopPost=-killall -s TERM twonkystarter
ExecStopPost=-killall -s TERM twonky
# Twonky 8.5.1 doesn't reload, it stops instead (on arm at least)
# ExecReload=kill -s HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
You need to be sure the paths in the ExecStart command match where you unpacked twonky, and also where you want the .pid file, configuration, logfile and runtime appdataunless you are happy with their default locations.
After putting that all into/etc/systemd/system/twonky.server, run
sudo systemctl daemon-reload
sudo systemctl start twonky
sudo systemctl enable twonky

Related

Add dependency between two systemd services to start again if one of them is killed

I have two systemd services A.service and B.service in /etc/systemd/system/ directory.
Below is the configuration in A.service
[Unit]
Description=A Service
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/opt/myapp/A_service.sh -a start
ExecStop=/opt/myapp/A_service.sh -a stop
[Install]
WantedBy=multi-user.target
Below is the configuration in B.service
[Unit]
Description=B Service
After=A.service
BindsTo=A.service
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/opt/myapp/B_service.sh -a start
ExecStop=/opt/myapp/B_service.sh -a stop
[Install]
WantedBy=multi-user.target
I want to create a dependency such that when A.service gets restarted B.service should also get restarted.
But it's not working when i kill A.service with sudo kill -9 <A.service pid>.
I can see A.service getting restarted after kill but B.service is in stopped state, not getting restarted.
Can someone help me configure this dependency?
Thanks in Advance.
You want to use the PartOf dependency.
https://www.freedesktop.org/software/systemd/man/systemd.unit.html#PartOf=
PartOf=
Configures dependencies similar to Requires=, but limited to stopping and restarting of units. When systemd stops or restarts the units listed here, the action is propagated to this unit. Note that this is a one-way dependency — changes to this unit do not affect the listed units.
When PartOf=b.service is used on a.service, this dependency will show as ConsistsOf=a.service in property listing of b.service. ConsistsOf= dependency cannot be specified directly.
Description=B Service
After=A.service
BindsTo=A.service
PartOf=A.service
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/opt/myapp/B_service.sh -a start
ExecStop=/opt/myapp/B_service.sh -a stop
[Install]
WantedBy=multi-user.target

How to run rqlite as a service?

Can rqlite run as a Linux service? so it can be start/stop/restart with systemctl command. Any example of the service file would be appreciated.
A basic systemd service file with ExecStart set to your rqlited command should suffice. See example below.
A more thorough service file can be found in the very good Arch User Repo package of rqlite.
It also includes creation of rqlite system user and directory and more security considerations.
Information on how to form a cluster with rqlite started as a service can be found on XenGi, the packager's page. It makes use of an environment file that sets the arguments of rqlite nodes.
[Unit]
Description=
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/rqlited -http-addr 0.0.0.0:4001 -raft-addr 0.0.0.0:4002 /path/to/datadir
User=youruser
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGTERM
Restart=always
[Install]
WantedBy=multi-user.target

How can i run a python file as service python3

I have a python script and that I have to run as a service/background process, I have tried python-daemon but it gives me errors is there any good way to run it as a service so that the script can be run in the background to accept messages and process files?
I have made a sytemctl service file in /lib/systemed/system
The file content is
[Unit]
Description=RPC SERVER
After=network.target
[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/
Type=simple
ExecStart=/usr/bin/ python3 /home/ubuntu/rpc.py
[Install]
WantedBy=multi-user.target
/home/ubuntu/rpc.py is my python script path
and i saved the file as rpcservertest.service
so i can start the service using
sudo systemctl start rpcservertest.service
to stop
sudo systemctl stop rpcservertest.service
and to get status
sudo systemctl status rpcservertest.service

Shell Script Spawned From systemd Node App Doesn't Edit etc File

I have a systemd service that starts a Node app on boot. The Node app uses child_process.spawnSync to launch a shell script that edits /etc/wpa_supplicant/wpa_cli-actions.sh using sed.
The wpa_cli-actions.sh file is edited correctly if I launch the Node app manually from the command line, but is not edited correctly when the app is launched by systemd. My systemd service file is based on another one that launches a similar service, so I'm not sure what I'm doing wrong. I haven't seen any errors related to this in the journalctl output. Below is my service file.
[Unit]
Description=The Edison status and configuration service
After=mdns.service
[Service]
ExecStart=/bin/su root -c 'node /usr/lib/config-server/app.js'
Restart=always
RestartSec=10s
StandardOutput=journal
StandardError=journal
SyslogIdentifier=edison-config
PrivateTmp=no
Environment=NODE_ENV=production
User=root
Group=root
[Install]
WantedBy=default.target
Try The following, And root is enabled by default if you don't specify User or Group, replace entire <path to node> with your path to node, it can be found with which node.
[Unit]
Description=The Edison status and configuration service
After=mdns.service
[Service]
ExecStart=<path to node> /usr/lib/config-server/app.js
WorkingDirectory=/usr/lib/config-server
Restart=always
RestartSec=10s
StandardOutput=journal
StandardError=journal
SyslogIdentifier=edison-config
PrivateTmp=no
Environment=NODE_ENV=production
[Install]
WantedBy=default.target

systemctl service not starting after system restart

I have this service which I want to be able to start as a service on system restart. I am using Ubuntu 15.10. The service configuration file looks like this:
[Unit]
Description=Service client
After=syslog.target
[Service]
ExecStart=/bin/bash -c "/usr/local/bin/service_clientd start"
ExecStop=/bin/bash -c "/usr/local/bin/service_clientd stop"
Type=simple
[Install]
WantedBy=multi-user.target
The service starts perfectly with systemctl command, but does not start automatically after system restart.
Do this:
systemctl enable servicename.service
https://wiki.archlinux.org/index.php/systemd#Using_units

Resources