使用bash脚本将实时输出发布到Slack

问题描述 投票:0回答:2

我有一个 python 脚本,正在使用 cron 作业执行。该脚本在执行时会生成一些输出,我希望将其实时发布到 Slack 频道。

这是我的 bash 脚本:

#!/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

这个脚本可以工作,但是一旦 python 脚本执行完毕,它当然会将所有消息发布到 slack。有什么方法可以配置它,以便在 python 脚本仍在执行时将消息实时发送到 Slack?

python bash slack-api
2个回答
2
投票

您可以通过进程替换读取

run.py
脚本的输出:

#!/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"

将代码粘贴到 shellcheck.net 并查看建议的更改也可能很有用。


0
投票

您的脚本根本不应该工作,因为您没有执行

run.py
但您正在将工作目录更改为它,因此除非
run.py
是一个目录,否则您的脚本应该会失败。

此外,bash 脚本中的命令是按顺序执行的,因此如果您启动 python 命令然后读取日志,难怪您没有实时获取日志行。

我要做的是使用一些管道和 xargs:

#!/bin/bash

/path/to/script/run.py | grep -e "Message" | sed "s/\"/'/g" | xargs -I{} curl -L -X POST --silent --data-urlencode 'payload={"text":"{}"}' https://hooks.slack.com/services/xxx

我已将

-L
添加到了 curl 命令中,因为
hooks.slack.com
会重定向到
api.slack.com
,如果没有该标志,
curl
将在
302
之后停止,而不是跟随响应中的
Location
标头。

© www.soinside.com 2019 - 2024. All rights reserved.