Help with delaying script and implementing checks before completion
Hello everyone,
I was wondering if any of you could help me with this. I am an absolute beginner and don't know how to program, but I can follow a tutorial and tweak code sometimes. My understanding of programing is limitted to what for and while loops do, and how if then else logic works. That being said:
My setup is that I have a raspberry pi hooked up to an APC UPS via USB. When mains power goes out, the UPS triggers a "powerout" script which, in turn, sends me an email notification and calls me to my home number and my mobile phone using a SIP account, and a pre-recorded message plays when the call is answered.
I've got this working following various tutorials readily available on the internet.
However, there is a huge problem with this setup as when there is a little fluctuation in the mains power, the UPS turns to battery power in matter of miliseconds and the script is triggered regardless of the fact that power may return in a couple more miliseconds. Therefore I tend to receive calls alerting me of a power failure in the middle of the night and it is really inconvenient.
Therefore, I was hoping that you guys could help me tweak the script so that it waits for, let's say, 10 seconds, then checks again the UPS status, and, only if the UPS is still running on batteries after those 10 secs. places the phone call.
Here is the script which gets triggered when the power goes out:
As you can see, the calling home part is dealt with at the very end of the script by calling a python script (alerthome.py) and Ideally, I would like to pause execution of the script for 10 seconds before that line of code, then somehow check the ups status and, if the power is still out, place the call, but if the power has already returned, exit the script before calling alerthome.py
I imagine it will be easy to pause execution for 10 secs. but the part I really need help with is checking the UPS status.
Also, I guess it could be done by either parsing the results of "cat /var/log/apcupsd.events" where the output is something like:
As you can see those lasts ones were legit power outages but it is not always the case. What I would need to do is check whether the last line says either "Power failure." or "Running on UPS batteries." and, in that case place the call, or whether it reads "Mains returned. No longer on UPS batteries." or "Power is back. UPS running on mains." and in that case abort the phone call, but I don't know how to do it.
Another option would be to get the script to call "apcaccess" which produces an output like the following one:
As you can see, the idea would be similar, I would need to parse this output (which I don't know how to do) to get the value of the "STATUS" line. which will either read ONLINE if the ups is running on mains power, and something else (I don't remember it right now) if it is running on batteries.
Thank you very much in advance. Any help will be much appreciated. Have a nice weekend
Last edited by Scott; 06-18-2017 at 06:55 AM..
Reason: Please use code tags
Either method is possible; I'd prefer the second with apcaccess as it describes the actual status of the UPS while the log could be delayed / overwritten / have other, meaningless lines. You also seem to have it in your script but commented out. Unfortunately, I don't know apcaccess and so can't tell which info indicates a "power out" status and maybe more (mayhap on top of "STATUS: ONLINE", one of the bits in STATFLAG might give deeper insight?).
Assuming it were the STATUS line, and stealing from your script, try (untested, and not sure the sh shell will correctly run this, you may need e.g. bash)
Remove the echo when happy with the result.
Final comment: the "shebang" in your script #!/bin/sh needs to be in the very first line to become effective, i.e. determines the shell to be run to execute your code.
I'll surely give it a try and let you know how it went although I might not be able to fully test it for a couple of weeks since I have this set up in a remote location and I need to be able to unplug the ups to test it.
Thanks again
---------- Post updated 19-06-17 at 02:19 PM ---------- Previous update was 18-06-17 at 02:29 PM ----------
Thank you very much @RudiC it works perfectrly well!
I forgot to mention that the main script was a python script and I could not integrate your code directly. Instead, I have placed it on a separate .sh which handles the logic for either calling or not calling based on the status of the UPS after 10 seconds and I call that one from the main script.
Hi,
I'm trying to send out mails from my server using mailx, however everytime I send one, it appears to be held in the /var/spool/mqueue for 44 mins before being sent.
I'm quite new to sendmail, so don't really know where to start with this /var/log/syslog displays the following:
Dec 16... (4 Replies)
Hi All,
I have a cron job set up which is set to run every 10 seconds.
What I need to do is have the script do a check to see if it is already running such that if it is running it wont fire up additional instances and processes according to its normal process.
For example if I have a script... (4 Replies)
hi ,
i want write the script which automatically send an alert mail to my mail id when there is low memory available.
things which i am able to implement -:
i got the output of current memory status into one file . Than i break down the required coloumn and again send it in another file.
My... (1 Reply)
Hi ,
I need a script for processing below scenario.
I have to check daily by doing ftp IP to check it is logging or not.
So i want this activity to be automated such that if login succesful i will get "FTP LOGIN SUCCESS" in a log file and if fails i want the error message in the same log... (1 Reply)
Hi ,
I need a script which performs below activity
I have one file named "testfile" in 9 different directories with same name.
I want to perform below action with each testfile of each directory.
if ; then
mv listfiles listfiles_`date +%b%y`
else
echo No Such files
fi
... (4 Replies)
Hi.
I'm triyng to make a Bash Script that checks (recursively) the MD5 from all the files in a certain directory and compare them against some other check that should be already done and saved in a file.
I've reached to the point where i have the MD5 from the file and the MD5 that the script... (1 Reply)
Ok, so this may be an unusual request. But I have a certificate that expires sometime in may of 2011. Now, i have to monitor this certificate and alert when the current time is within 30 days of may 20, 2011.
#!/usr/bin/perl
#
use Time::Local;
#
$sec=59;
$min=59;
$hours=23;
$day=31;... (3 Replies)
Hi All,
I have a requirement to perform the following checks.
Input file is a "|" delimited file and looks like this.
A|c1|c2|c3|....
B|G1|G2|G3....
C|H1|H2|H3...
A|c4|c5|c6|....
B|G4|G5|G6....
C|H4|H5|H6...
Now the check is to see if all the "A" records have a corresponding B... (7 Replies)
When I try to send mail, sendmail delays a lot. After monitoring syslog, I noticed that sendmail starts with this first message... waits a minute and gives the second message... waits another minute and then sends off the email. How do I correct this in sendmail or completly disable it. I'm sending... (0 Replies)
Hello,
I'm trying to write a script that checks for previous instances of the same script which may still be running (this script is scheduled to run every 30 minutes). I want to somehow use the pid from each instance to make sure the previous one isn't running before continuing with my... (5 Replies)