'How to only show output from shell script that is running as a service?
I write a shell script and installed it on systemctl to run on startup, everything works fine, however if i run "systemctl status myservice" it shows all my script source code instead only the outputs of my script my script looks similar to this (as a example):
while true
do
   echo "pinging..."
   ping -c 10 google.com
   .... blah blah ....
   .... blah blah ....
done
if i do systemctl status myservice it show my code instead "pinging..." and the ping output, how can i do that systemctl only shows the output instead the code?
Here is my systemctl status and systemctl cat outputs:
$systemctl status checkupserver:
● checkupserver.service - Check Servers Online Service
     Loaded: loaded (/etc/systemd/system/checkupserver.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-05-09 20:54:21 UTC;
   Main PID: 471544 (bash)
      Tasks: 2 (limit: 9054)
     Memory: 1.2M
     CGroup: /system.slice/checkupserver.service
             ├─ 571033 /bin/checkservers.sh                                                            >
echo "Starting Service..."
while true
do
        echo "pinging server..."
        ping -c 10 serverip
        ... blah blah ...
done
 /bin/checkservers.sh
             └─4785411 /bin/checkservers.sh                                                            >
echo "Starting Service..."
while true
do
        echo "pinging server..."
        ping -c 10 serverip
        ... blah blah ...
done
 /bin/checkservers.sh
$systemctl cat checkupserver:
# /etc/systemd/system/checkupserver.service
[Unit]
Description=Check Servers Online Service
[Service]
User=checker
ExecStart=/bin/checkservers.sh
Restart=always
RestartSec=10
TimeoutStopSec=90
KillMode=process
SyslogIdentifier=CheckServers
[Install]
WantedBy=multi-user.target
Solution 1:[1]
You're just receiving the printout of the script because you haven't told it how it can be run from your shell.
So you have two options here.
- Change your script so it has the appropriate shebang at the start
#!/bin/bash
while true
do
   echo "pinging..."
   ping -c 10 google.com
   .... blah blah ....
   .... blah blah ....
done
or 2. Tell your service file how to execute the script
# /etc/systemd/system/checkupserver.service
[Unit]
Description=Check Servers Online Service
[Service]
User=checker
ExecStart=/bin/bash -c /bin/checkservers.sh
Restart=always
RestartSec=10
TimeoutStopSec=90
KillMode=process
SyslogIdentifier=CheckServers
[Install]
WantedBy=multi-user.target
Either of the two options will give you the below output:
root@var-som-mx6:/tmp# systemctl status checkupserver.service 
? checkupserver.service - Check Servers Online Service
   Loaded: loaded (/tmp/checkupserver.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 1970-01-05 20:11:38 UTC; 4s ago
 Main PID: 3645 (bash)
   CGroup: /system.slice/checkupserver.service
           ??3645 /bin/bash -c /tmp/checkservers.sh
           ??3646 ping -c 10 10.7.0.50
Jan 05 20:11:38 var-som-mx6 systemd[1]: Started Check Servers Online Service.
Jan 05 20:11:39 var-som-mx6 CheckServers[3645]: pinging...
Jan 05 20:11:39 var-som-mx6 CheckServers[3645]: PING 10.7.0.50 (10.7.0.50): 56 data bytes
Jan 05 20:11:39 var-som-mx6 CheckServers[3645]: 64 bytes from 10.7.0.50: seq=0 ttl=64 time=0.406 ms
Jan 05 20:11:40 var-som-mx6 CheckServers[3645]: 64 bytes from 10.7.0.50: seq=1 ttl=64 time=0.463 ms
Jan 05 20:11:41 var-som-mx6 CheckServers[3645]: 64 bytes from 10.7.0.50: seq=2 ttl=64 time=0.369 ms
Jan 05 20:11:42 var-som-mx6 CheckServers[3645]: 64 bytes from 10.7.0.50: seq=3 ttl=64 time=0.399 ms
Jan 05 20:11:43 var-som-mx6 CheckServers[3645]: 64 bytes from 10.7.0.50: seq=4 ttl=64 time=0.453 ms
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | Brendan | 
