Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

systemd service startup issue

Tags:

centos

systemd

This is the first time I've used systemd and a bit unsure about something.

I've got a service that I've set up (for geoserver running under tomcat):

[Unit]
Description=Geoserver
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/geoserver/bin/startup-optis.sh
ExecStop=/usr/local/geoserver/bin/shutdown-optis.sh
User=geoserver

[Install]
WantedBy=multi-user.target

The start up script does an exec to run java/tomcat. Starting up the service from the commandline appears to work:

 sudo systemctl start geoserver

However the command does not return until I ctrl-c, this doesn't seem right to me. The java process remains running afterwards though and functions normally. I'm reluctant to reboot the box to test this in case this is going to cause problems during init and it's a remote machine and it would be a pain to get someone to address it.

like image 476
vickirk Avatar asked Apr 08 '15 07:04

vickirk


People also ask

How do I enable systemd service on startup?

2 Enabling and disabling services with systemctlsystemctl is the systemd command for controlling how services start on a Linux system. A service can be enabled, disabled, or masked, and it can be configured to start at boot, on-demand, manually, or prevented from starting under any circumstances.

Why does systemd service fail?

A Failed Systemd Service There might be any number of reasons responsible for a service crash or failure such as misconfigurations, lack of system resources, file/data corruptions etc ..

How do I fix systemd errors?

Fix 1: Replacing systemctl with service command. A simple fix for the error in question is to use the service command instead of the error causing systemctl command. service command helps in running the SystemV init script which is used by the older Linux distributions.


1 Answers

You need to set correct "Type" in "Service" section:

[Service]
...
Type=simple
...

Type

Configures the process start-up type for this service unit. One of simple, forking, oneshot, dbus, notify or idle.

If set to simple (the default if neither Type= nor BusName=, but ExecStart= are specified), it is expected that the process configured with ExecStart= is the main process of the service. In this mode, if the process offers functionality to other processes on the system, its communication channels should be installed before the daemon is started up (e.g. sockets set up by systemd, via socket activation), as systemd will immediately proceed starting follow-up units.

If set to forking, it is expected that the process configured with ExecStart= will call fork() as part of its start-up. The parent process is expected to exit when start-up is complete and all communication channels are set up. The child continues to run as the main daemon process. This is the behavior of traditional UNIX daemons. If this setting is used, it is recommended to also use the PIDFile= option, so that systemd can identify the main process of the daemon. systemd will proceed with starting follow-up units as soon as the parent process exits.

Behavior of oneshot is similar to simple; however, it is expected that the process has to exit before systemd starts follow-up units. RemainAfterExit= is particularly useful for this type of service. This is the implied default if neither Type= or ExecStart= are specified.

Behavior of dbus is similar to simple; however, it is expected that the daemon acquires a name on the D-Bus bus, as configured by BusName=. systemd will proceed with starting follow-up units after the D-Bus bus name has been acquired. Service units with this option configured implicitly gain dependencies on the dbus.socket unit. This type is the default if BusName= is specified.

Behavior of notify is similar to simple; however, it is expected that the daemon sends a notification message via sd_notify(3) or an equivalent call when it has finished starting up. systemd will proceed with starting follow-up units after this notification message has been sent. If this option is used, NotifyAccess= (see below) should be set to open access to the notification socket provided by systemd. If NotifyAccess= is not set, it will be implicitly set to main. Note that currently Type=notify will not work if used in combination with PrivateNetwork=yes.

Behavior of idle is very similar to simple; however, actual execution of the service binary is delayed until all jobs are dispatched. This may be used to avoid interleaving of output of shell services with the status output on the console.

like image 67
Dmitry Shihovtsev Avatar answered Sep 19 '22 18:09

Dmitry Shihovtsev