I want to grep a specific status of a service (tomcat8.service).

Only if the string was found, I want to execute some logic.

Problem: even if I execute the script on service name that does not exist ("asd" in this example), the if $status still matches and prints out. But why?

status = $(systemctl status asd.service | grep 'active') echo $status if $status then echo "$SERVICE was active" exit 0 fi exit 0 

Result output is: asd.service was active, which is certainly not true.

The echo $status prints: status: Unknown job: =

1

2 Answers

You can make use of grep's return status.

systemctl status asd.service | grep 'active' \ && status=active \ || status=not_active if [ "$status" == "active" ]; then [...] fi 

or even easier:

test $(systemctl status asd.service | grep 'active') \ && echo "$SERVICE was active" 

or if you prefer if:

if $(systemctl status asd.service | grep 'active'); then echo "$SERVICE was active" fi 

Anyways, take care about the keywords inactive, not active, active (exited) or alike. This will also match your grep statement. See the comments. Thanks @ Terrance for the hint.


Update:

No need for grep. systemctl has the command is-active included.

systemctl -q is-active asd.service \ && echo "$SERVICE was active" 

or:

if systemctl -q is-active asd.service; then echo "is active"; fi 
8

Some code review comments:

  • sh/bash/ksh/zsh variable assignments look like var=value -- no spaces around the = are allowed. (documentation)
  • status=$(some command) -- the status variable hold the output of the command, not the exit status. The exit status is in the $? variable
  • the if statement acts on the exit status of the subsequent command (documentation)

    if some_comment; then action1; else action2; fi 

    Most often, the command is [ or [[ to test some condition.

    However, grep has a clear exit status: 0 if the pattern was found, 1 otherwise. So you want this:

    if systemctl status asd.service | grep -q 'active'; then echo "$SERVICE was active" fi 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy