cronjob 无法用于 Slack 的每日消息传递

cronjob 无法用于 Slack 的每日消息传递

Ubuntu 20.04
Python 3.8

我尝试每天上午 9 点使用 crontab 向 slack 频道发送一条消息。

下列的https://www.youtube.com/watch?v=5bTkiV_Aadc&t=482s当我每分钟写入日志文件时,crontab 成功工作。

然而,将相同的方法复制到松弛消息传递似乎不起作用,并且找不到原因。

以下是我迄今为止尝试过的方法(参考:为什么 crontab 脚本不起作用?

首先,我的代码如下:

from dotenv import load_dotenv
import datetime
import numpy as np
import os
import pandas as pd
from pathlib import Path
import plotly.graph_objects as go
import slack

# ---- Commented out -----
# from extract_data import DataExtraction
# from const import inf_type, slack_channel
# env_path = Path('.') / '.env'
# load_dotenv(dotenv_path=env_path)
# --------------

date = (datetime.date.today() - datetime.timedelta(days=1)).strftime("%Y%m%d")
dir_path = os.path.dirname(os.path.realpath(__file__))
filename = os.path.join(dir_path, 'test_log.log')

# Logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler(filename)
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(file_handler)

def write_to_log():
    logger.info("test")


if __name__ == "__main__":
    write_to_log()
  1. 仅当我在使用环境变量或导入脚本时注释掉部分内容时,上述代码才适用于 crontab。

  2. 检查后发现,将写入日志文件的功能改为将写入日志发送至 slack 似乎不起作用。

这是替换后的代码(以上所有代码都相同)

def send_msg():
    client = slack.WebClient(token="Token_name")
    client.chat_postMessage(channel="#slackbot_test", text="helllo")

if __name__ == "__main__":
    send_msg()

目前在搜索中没有找到 crontab 是否不能与 slack 一起使用,如能提供任何帮助将不胜感激,谢谢!

答案1

通过 运行的作业cronsystemd启动脚本不会在与桌面相同的运行时环境中运行。systemd启动脚本以 运行root。您的任何PATH更改或其他环境变量设置都不会自动传播到您的cron作业。例如,没有$DISPLAY,因此 GUI 程序需要特殊处理(阅读man xhost)。

cron人们可以在crontab文件 Read中为所有作业设置环境变量man 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias查看每个环境中的结果 。

由于command该行的一部分crontab默认由 解释/bin/sh,其语法比 更简单/bin/bash,因此我建议command调用一个bash脚本(可执行、已安装、以 开头#!/bin/bash)来设置环境,然后调用所需的程序。

相关内容