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: =
You can make use of grep's return status.
or even easier:
or if you prefer
if
:Anyways, take care about the keywords
inactive
,not active
,active (exited)
or alike. This will also match yourgrep
statement. See the comments. Thanks @ Terrance for the hint.Update:
No need for grep.
systemctl
has the commandis-active
included.or:
Some code review comments:
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$?
variablethe
if
statement acts on the exit status of the subsequent command (documentation)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: