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()
仅当我在使用环境变量或导入脚本时注释掉部分内容时,上述代码才适用于 crontab。
检查后发现,将写入日志文件的功能改为将写入日志发送至 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
通过 运行的作业cron
或systemd
启动脚本不会在与桌面相同的运行时环境中运行。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
)来设置环境,然后调用所需的程序。