Skip to content

Simple bash website monitoring script

Moved Tips
2 2 775 1
  • Not everyone can afford expensive operational monitoring tools, so here’s a cheap and dirty way to use cURL to scrape a webpage, return it’s status, and then compare it with the value you’d get if the page was up. If that doesn’t match, we assume the page is down, and then trigger an email as an alarm.

    #!/bin/bash
    CURLOPT_SSL_VERIFYPEER => 0
    # Your site URL goes here
    website="https://your.forum.url*";
    result=$(curl -m 60 -Is $website | head -n 1 | tr -d "\r")
    # note that this value varies depending on platform. You should echo $result to see what the correct value is when querying the site itself when you know it's running.
    expecting="HTTP/2 200"; 
    timestamp=$(date);
    if [ "$result" = "$expecting" ];
    then
        output="$timestamp -> $website $result -> Website UP";
        echo $output;
        echo $output >> /path/to/your/logfile/log.txt 
    else
        output="$timestamp -> $website $result -> Website DOWN";
        echo $output;
        echo $output >> /path/to/your/logfile/log.txt 
        # Fire an alert as the result isn't what we expected
        mailbody="$output"
        echo "From: email@domain.com" > /tmp/mail.tmp
        echo "To: email@domain.com" >> /tmp/mail.tmp
        echo "Subject: ALERT: Website $website is DOWN" >> /tmp/mail.tmp
        echo "" >> /tmp/mail.tmp
        echo $mailbody >> /tmp/mail.tmp
        cat /tmp/mail.tmp | /usr/sbin/sendmail -t -f "email@domain.com"
    fi
    

    This is very primitive, but works very well. Note, that sendmail is being used here to trigger an email. If you do not have that, you’ll need to substitute the path and command for whatever you want to use.

    Have fun…

  • Not everyone can afford expensive operational monitoring tools, so here’s a cheap and dirty way to use cURL to scrape a webpage, return it’s status, and then compare it with the value you’d get if the page was up. If that doesn’t match, we assume the page is down, and then trigger an email as an alarm.

    #!/bin/bash
    CURLOPT_SSL_VERIFYPEER => 0
    # Your site URL goes here
    website="https://your.forum.url*";
    result=$(curl -m 60 -Is $website | head -n 1 | tr -d "\r")
    # note that this value varies depending on platform. You should echo $result to see what the correct value is when querying the site itself when you know it's running.
    expecting="HTTP/2 200"; 
    timestamp=$(date);
    if [ "$result" = "$expecting" ];
    then
        output="$timestamp -> $website $result -> Website UP";
        echo $output;
        echo $output >> /path/to/your/logfile/log.txt 
    else
        output="$timestamp -> $website $result -> Website DOWN";
        echo $output;
        echo $output >> /path/to/your/logfile/log.txt 
        # Fire an alert as the result isn't what we expected
        mailbody="$output"
        echo "From: email@domain.com" > /tmp/mail.tmp
        echo "To: email@domain.com" >> /tmp/mail.tmp
        echo "Subject: ALERT: Website $website is DOWN" >> /tmp/mail.tmp
        echo "" >> /tmp/mail.tmp
        echo $mailbody >> /tmp/mail.tmp
        cat /tmp/mail.tmp | /usr/sbin/sendmail -t -f "email@domain.com"
    fi
    

    This is very primitive, but works very well. Note, that sendmail is being used here to trigger an email. If you do not have that, you’ll need to substitute the path and command for whatever you want to use.

    Have fun…

    @phenomlab this is useful 👍 thanks


Related Topics
  • Rename videos in bulk - linux commands

    Unsolved Tips gopro linux commands
    12
    4 Votes
    12 Posts
    2k Views
    @Hari Yes, that’s one (of many) I would recommend. It’s going to be easier to do this under Windows and the fact that you are already connected using SMB is a huge plus.
  • Adding a banner to chat messages

    Tips banner custom
    38
    1
    18 Votes
    38 Posts
    7k Views
    @phenomlab said: @DownPW Possible, yes, but not using the existing code. It would need to be changed to test for multiple entries based on two distinct widget areas. This should work (it’s already applied on your DEV server) function chatBanner() { var roomName = $("h5[component='chat/header/title']").text().trim(); var roomNameWidget = $('[id*="chat-modal"] .btn-ghost.btn-sm.dropdown-toggle').text().trim(); var bannerContent; if (roomName === "General" || roomNameWidget === "General") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Message 1. </div>'; } else if (roomName === "Support" || roomNameWidget === "Support") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Message 2.</div>'; } else if (roomName === "Info" || roomNameWidget === "Info") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Message 3</div>'; } else if (roomName === "xxxxxx" || roomNameWidget === "xxxxxx") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Message 4</div>'; } else if (roomName === "xxxxxx" || roomNameWidget === "xxxxxx") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Message 5</div>'; } else if (roomName === "xxxxxx" || roomNameWidget === "xxxxxx") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Message 6</div>'; } else { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Ce canal est une discussion privée. </div>'; } var chatMessagesContainer = $('[component="chat/system-message"]:last-of-type'); //var existingMessages = $('[component="chat/message"]'); var existingMessages = $('[component="chat/composer"]'); if (existingMessages.length === 0) { // If there are no messages, append the banner to the messages container chatMessagesContainer.first().after(bannerContent); } else { // If there are messages, add the banner after the last message //existingMessages.last().after(bannerContent); existingMessages.before(bannerContent); } } Here, we are using || which is essentially an OR operator. Because we cannot know the chat room ID in advance, it is necessary to use a wildcard to track it [id*="chat-modal"] .btn-ghost.btn-sm.dropdown-toggle I see bugs with this code and chat box widget I use on my categories page What was happening NodeBB allows multiple chat windows to be open simultaneously , the widget and the full/modal-page DM view. Both exist in the DOM at the same time. The original code used global jQuery selectors like $(‘[component=“chat/composer”]’) which scanned the entire page and found elements from both chat windows at once. When you opened “XY” caht while “XXY” was still open in the widget, the selectors would pick up the wrong room name or inject the banner into the wrong window. The key discovery was that the action:chat.loaded event passes the modal DOM element directly as data. By wrapping it in $(data) and using $modal.find(…) for every selector, all queries are scoped exclusively to the correct modal, making it impossible for two open chat windows to interfere with each other. FIX code (to adapt to your rooms) : function chatBanner(modalElement) { var $modal = $(modalElement); $modal.find('#chatbanner').remove(); var roomName = $modal.find('[component="chat/room/name"]').text().trim(); if (!roomName) { var placeholder = $modal.find('[component="chat/input"]').attr('placeholder') || ''; roomName = placeholder.replace(/^Message #?/, '').trim(); } var bannerContent; if (roomName === "General") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Chat message banner</div>'; } else if (roomName === "xxxxxxxxxx") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Chat message banner</div>'; } else if (roomName === "xxxxxxxxxx") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Chat message banner</div>'; } else if (roomName === "xxxxxxxxxx") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Chat message banner</div>'; } else if (roomName === "xxxxxxxxxx") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Chat message banner</div>'; } else if (roomName === "Les geeks de l'espace") { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Chat message banner</div>'; } else { bannerContent = '<div id="chatbanner"><i class="fa fa-fw fa-circle-info link-primary" aria-hidden="true"></i> Chat message banner</div>'; } $modal.find('[component="chat/composer"]').first().before(bannerContent); } $(window).on('action:chat.loaded', function(ev, data) { chatBanner(data); });
  • 1 Votes
    1 Posts
    544 Views
    No one has replied
  • 3 Votes
    6 Posts
    1k Views
    Seems like Google is finally crawling this site. And, “crawling” in the sense that it’s still extremely slow …
  • Which is Better Samsung S23 or Xiaomi 13

    Tips xiaomi 13 samsung s23
    5
    3 Votes
    5 Posts
    1k Views
    @DownPW Same here.
  • 2 Votes
    2 Posts
    878 Views
    As an aside to this, there is also the command of tasklist which will provide a list of processes running on your machine, or a remote machine you are looking to query. [image: 1678806102692-000a408c-cc7e-450f-8e5e-bed9a4238a05-image.png] There is also a useful list of switches below, plus the ability to format into a table, or CSV. https://ss64.com/nt/tasklist.html
  • Killing Linux Zombie Processes

    Tips zombie linux
    3
    7
    2 Votes
    3 Posts
    1k Views
    @DownPW odd indeed. Looks like it’s spawning, immediately dying, then spawning again.
  • Invalid CSRF on dev install

    Moved Solved Tips csrf
    10
    5 Votes
    10 Posts
    6k Views
    @DownPW which version of MongoDB are you using?