Below is a python version of the Bash script to check uptime.
Like the bash version, it is designed to be run by cron every minute and will email when the new uptime is lower than the uptime from the last run.
The tmpfile /tmp/uptime.txt must exist and contain a number for the script to work.
#!/usr/bin/env python # # uptime-check.py # Check uptime and mail if uptime is less than it was when script last ran # http://linux-101.org # import os import smtplib import traceback import subprocess # recipient(s) MUST be a list recipient = ["user@example.com"] sender = "uptime@example.com" tmp = "/var/tmp/uptime.txt" class Server: def __init__(self): self.hostname = "unknown server" self.uptimeold = None self.uptimenew = None def sendMail(self, sender, recipient, data): mailserver = smtplib.SMTP('mail.uplinkzero.com') mailserver.set_debuglevel(0) mailserver.sendmail(sender, recipient, data) mailserver.quit() def main(): myserver = Server() cmd = subprocess.Popen("hostname", shell=True, stdout=subprocess.PIPE) out = cmd.stdout.readlines() myserver.hostname = out[0].rstrip("\n") tmpfile = open(tmp,"r") oldupstr = tmpfile.read() myserver.uptimeold = float(oldupstr.rstrip("\n")) tmpfile.close() uptimef = open("/proc/uptime", "r") newupstr = uptimef.read() newuplst = newupstr.split() myserver.uptimenew = float(newuplst[0]) uptimef.close() print "Hostname = %s" %(myserver.hostname) print "Old uptime = %s" %(myserver.uptimeold) print "New uptime = %s" %(myserver.uptimenew) if myserver.uptimenew <= myserver.uptimeold: data = """Subject: %s has been rebooted Hostname = %s Old uptime = %s New uptime = %s""" %(myserver.hostname, myserver.hostname, myserver.uptimeold, myserver.uptimenew) try: myserver.sendMail(sender, recipient, data) print "Email sent" except: print "Email sending failed" tmpfile = open(tmp, "w") tmpfile.write(str(myserver.uptimenew)) tmpfile.close() else: tmpfile = open(tmp, "w") tmpfile.write(str(myserver.uptimenew)) tmpfile.close() if __name__ == "__main__": try: main() except Exception, e: print str(e) traceback.print_exc() os._exit(1)

