Search code examples
pythonbashslack-api

Post real time output to Slack with bash script


I have a python script that I am executing with cron job. This script generates some output while executing and I wish to post it to Slack channel in real time.

Here is a bash script that I have:

#!/bin/bash

log_file=logs_$(date '+\%Y-\%m-\%d_\%H:\%M').txt

cd /path/to/script/run.py > /path/to/logs/${log_file} 2>&1 

cat /path/to/logs/${log_file} | while read LINE; do
  (echo "$LINE" | grep -e "Message" ) && curl -X POST --silent --data-urlencode \
    "payload={\"text\": \"$(echo $LINE | sed "s/\"/'/g")\"}" "https://hooks.slack.com/services/xxxxxx";
done

This scrip works but it of course posts all messages to slack once the python script has already been executed. Is there any way I could configure it so that messages would be sent to Slack in real time while the python script is still being executed?


Solution

  • You may be able to read the output from your run.py script via process substitution:

    #!/bin/bash
    
    log_file=logs_$(date '+\%Y-\%m-\%d_\%H:\%M').txt
    
    while read -r line ; do
        printf "%s\n" "$line"
        (grep -e "Message" <<< "$line") && curl -X POST --silent --data-urlencode \
            "payload={\"text\": \"$(echo $line | sed "s/\"/'/g")\"}" "https://hooks.slack.com/services/xxxxxx";
    done < <(/path/to/script/run.py 2>&1) >> "$log_file"
    

    It may also prove useful to paste your code into shellcheck.net and have a look at the suggested changes.