0
votes

This is my first post so please be patient with me!

I have tried to create script that checks if service is unreachable (http error code), then Monit should restart program (Preview Service). Monit is run as user "spark".

This is phantomjs-check.sh code:

#!/bin/bash
# source: /opt/monit/bin/phantomjs-check.sh

url="localhost:9001/preview/phantomjs"

response=$(curl -sL -w "%{http_code}\\n" $url | grep 200)

if [ "$response" = "}200" ]
then
        echo "-= Toimii!!!! =-"
        exit 1
else
        echo "-= RiKKi!!!! =-"
        exit 0
fi
[root@s-preview-1 bin]#

If I manually kill previewservice and run that script I get exit code of 0 which is how that should work.

In Monit I have following conf:

check program phantomjs with path "/opt/monit/bin/phantomjs-check.sh"
if status = 0 then exec "/opt/monit/bin/testi.sh"

Currently I added some logging to it and this is test.sh code:

#!/bin/sh
# source: /opt/monit/bin/testi.sh

############# Added this for loggin purposes ############
#########################################################

dt=$(date '+%d/%m/%Y %H:%M:%S');
echo Testi.sh run at $dt >> /tmp/testi.txt

# Original part of the script
sudo bash /opt/previewservice/preview-service.sh start

In /etc/sudoers file I have line:

spark ALL=(ALL) NOPASSWD: /opt/previewservice/preview-service.sh

This command works from cli and it starts/restarts previewservice. I can run "testi.sh" script manually as spark [spark@s-preview-1 bin]$ ./testi.sh and it works as intended, but even Monit gets info that service is down it doesn't start.

$ cat /tmp/testi.txt
    Testi.sh run at 05/01/2018 10:30:04
    Testi.sh run at 05/01/2018 10:31:04
    Testi.sh run at 05/01/2018 10:31:26

$ cat /tmp/previews.txt (This line was created by preview-service.sh start script so it has been run.

File created 05/01/2018 09:26:44
********************************
Preview-service.sh run at 05/01/2018 10:31:26

tail -f -n 1000 /opt/monit/logfile shows following

[EET Jan  5 10:29:04] error    : 'phantomjs' '/opt/monit/bin/phantomjs-check.sh' failed with exit status (0) -- -= RiKKi!!!! =-
[EET Jan  5 10:29:04] info     : 'phantomjs' exec: /opt/monit/bin/testi.sh
[EET Jan  5 10:30:04] error    : 'phantomjs' '/opt/monit/bin/phantomjs-check.sh' failed with exit status (0) -- -= RiKKi!!!! =-
[EET Jan  5 10:30:04] info     : 'phantomjs' exec: /opt/monit/bin/testi.sh
[EET Jan  5 10:31:04] error    : 'phantomjs' '/opt/monit/bin/phantomjs-check.sh' failed with exit status (0) -- -= RiKKi!!!! =-
[EET Jan  5 10:31:04] info     : 'phantomjs' exec: /opt/monit/bin/testi.sh
[EET Jan  5 10:32:04] error    : 'phantomjs' '/opt/monit/bin/phantomjs-check.sh' failed with exit status (0) -- -= RiKKi!!!! =-
[EET Jan  5 10:32:04] info     : 'phantomjs' exec: /opt/monit/bin/testi.sh
[EET Jan  5 10:33:04] info     : 'phantomjs' status succeeded

And the last status succeeded comes when I run that testi.sh script as spark without sudoing.

Any tips what I should try next? I appreciate all the help I can get!

1
In general it is not a good idea to have sudo inside a scripts. Run the script itself with sudo instead. Also, try to change the line sudo bash /opt/previewservice/preview-service.sh start to sudo /opt/previewservice/preview-service.sh start. You are running bash with sudo instead of the script. - Ardit
I changed that sudo bash to sudo but no luck with that either. - JTM
why do you use #!/bin/sh and not #!/bin/bash in the script testi.sh. These interpreters may happen to be different depending on the distribution you use. - Ardit
I have tested like 100 and 1 different scripts and adjusted them a bit and tested. I'm not "true" Linux admin (at least not yet) and I have mostly worked with Ubuntu but nowadays CentOS is our primary OS. Can that affect so I can run them with user spark but when Monit runs script it can not? (Monit daemon is started as spark too). - JTM

1 Answers

0
votes

Monit is usually running at root user. Is it your case ? If yes, you probably don't need the sudo part.

After regarding you script working outside of Monit but not from Monit, Monit is having its own PATH environment variable which is very small. It is recommended to write full path to your script/binairies as:

/usr/bin/sudo /bin/bash /opt/previewservice/preview-service.sh start