Systemd cant start my script

Hi,
systemd cant start my script, but it work, at command prompt.
Code and execute at command prompt

#cat collector.sh
#!/bin/bash
case $1 in
        start)
        /home/postgres/scripts/pgwatch2/pgwatch2.sh
        /home/postgres/scripts/pgwatch2/pgwatch2_UI.sh
        ;;
        stop)
        kill -9 `cat  /home/postgres/scripts/pgwatch2/pgwatch2_UI.PID`; rm -f /home/postgres/scripts/pgwatch2/pgwatch2_UI.PID
        kill -9 `cat /home/postgres/scripts/pgwatch2/pgwatch2.PID` ; rm -f /home/postgres/scripts/pgwatch2/pgwatch2.PID
        ;;
        *)
        echo "Usage:  collector.sh start|stop"
        exit 1
esac


#  ./collector.sh start; sleep 3; for PID in `cat *.PID`; do ps -fp $PID;  done;
UID         PID   PPID  C STIME TTY          TIME CMD
postgres 120535      1  2 19:30 pts/1    00:00:00 /opt/app/pgwatch2/pgwatch2-master/pgwatch2/pgwatch2
UID         PID   PPID  C STIME TTY          TIME CMD
postgres 120537      1 21 19:30 pts/1    00:00:00 /bin/python3.6 /opt/app/pgwatch2/pgwatch2-master/webpy/web.py

#cat /home/postgres/scripts/pgwatch2/pgwatch2.sh
#!/bin/bash
. $HOME/.pgprofile_pgwatch2
/opt/app/pgwatch2/pgwatch2-master/pgwatch2/pgwatch2 >> /home/postgres/scripts/pgwatch2/pgwatch2.log 2>&1 &
echo $! > /home/postgres/scripts/pgwatch2/pgwatch2.PID

#cat /home/postgres/scripts/pgwatch2/pgwatch2_UI.sh
#!/bin/bash
. $HOME/.pgprofile_pgwatch2
/bin/python3.6 /opt/app/pgwatch2/pgwatch2-master/webpy/web.py >> /home/postgres/scripts/pgwatch2/pgwatch2_UI.log 2>&1  &
echo $! > /home/postgres/scripts/pgwatch2/pgwatch2_UI.PID

systemd service and start output

#cat collector.service
[Unit]
Description=Pgwatch2 Gathering Daemon

[Service]
User=postgres
Group=postgres
Type=notify
ExecStart=/home/postgres/scripts/pgwatch2/collector.sh start
[Install]
WantedBy=multi-user.target


# systemctl start collector.service
# systemctl status collector
�- collector.service - Pgwatch2 Gathering Daemon
   Loaded: loaded (/etc/systemd/system/collector.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Wed 2019-07-17 19:28:09 EEST; 6s ago
  Process: 120324 ExecStart=/home/postgres/scripts/pgwatch2/collector.sh start (code=exited, status=          0/SUCCESS)
 Main PID: 120324 (code=exited, status=0/SUCCESS)

Jul 17 19:28:09 pgwatch2db.estpak.ee systemd[1]: Starting Pgwatch2 Gathering Daemon...
Jul 17 19:28:09 pgwatch2db.estpak.ee systemd[1]: Started Pgwatch2 Gathering Daemon.

# journalctl -f -u collector

...
Jul 17 19:28:09 pgwatch2db.estpak.ee systemd[1]: Starting Pgwatch2 Gathering Daemon...
Jul 17 19:28:09 pgwatch2db.estpak.ee systemd[1]: Started Pgwatch2 Gathering Daemon.

Why systemd does not like my code?
thnx
br
Kaido

I think systemd considers it dead because the scripts run in background, and the foreground process quits. systemd would do its own tracking of PIDs. At the least you'd need to inform systemd what PID represents the live daemon.

For example, see this systemd service example. The 'service' is a script which loops continually, running in the foreground.

1 Like

systemd-cat is probably your suggestion
br
Kaido

--- Post updated at 22:03 ---

@Corona688 I can't figure out how to use it.
br
Kaido

Something like

# config for systemd
...
ExecStart=/path/to/collector2.sh
...

where collector2.sh is

#!/bin/bash

. $HOME/.pgprofile_pgwatch2
# Redirect standard output into logfile
exec >> /home/postgres/scripts/pgwatch2/pgwatch2.log
# Redirect standard error into logfile
exec 2>&1
# Run program with these outputs and the exact same PID we started with so systemd can track it
exec /opt/app/pgwatch2/pgwatch2-master/pgwatch2/pgwatch2

And the UI service would be a separate service like

# config for systemd
...
ExecStart=/path/to/collector2-ui.sh
...

and collector2-ui.sh would look like:

#!/bin/bash
. $HOME/.pgprofile_pgwatch2
# Save stdout to log file
exec >> /home/postgres/scripts/pgwatch2/pgwatch2_UI.log
# Redirect stderr to log file
exec 2>&1
# Run python with the exact same PID we started with, so that systemd can track it
exec /bin/python3.6 /opt/app/pgwatch2/pgwatch2-master/webpy/web.py

Both of these programs don't go into the background or save PID files - when you run things with systemd, that's systemd's job.

1 Like

I got a point:
"Both of these programs don't go into the background or save PID files - when you run things with systemd, that's systemd's job.
br
Kaido

I've had a few problems with systemd and a very simple start/stop script too. I was asked to set something that that was not a true service to run at boot time. After much testing and tracing, the problem I had was that systemd would run the start and then run the stop. Weird, but that's what it seemed to do. I got past this by adding a RemainAfterExit=yes clause in my service definition file.

The whole thing in /etc/systemd/system/robin.service (okay I changed the name) is pasted below:

[Unit]
Description=Robin service daemon
Wants=network.service

[Service]
Type=simple
User=robin_srv
ExecStart=/usr/local/scripts/robin-service.sh start
ExecStop=/usr/local/scripts/robin-service.sh  stop
TimeoutStartSec=0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

After that it is a start/stop script much like to have that is being called.

Does that help?

Kind regards,
Robin

1 Like

Hi rbatte1
I will test your example
br
Kaido

@rbatte1
Your example works in My case too :slight_smile:
br
Kaido