我有一个 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?
您可以通过进程替换读取
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 并查看建议的更改也可能很有用。
您的脚本根本不应该工作,因为您没有执行
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
标头。