如何在树莓派或其他Unix系统上编写多命令的cron作业

0 投票
2 回答
961 浏览
提问于 2025-04-18 15:52

我正在尝试在Python 3中运行一个定时任务脚本,所以我需要设置一个虚拟环境(如果有更简单的方法,请告诉我)。为了运行这个脚本,我需要在脚本的父文件夹中,因为它会在那儿写入文本文件。以下是我想出来的一长串命令,它在控制台中可以正常工作,但在定时任务中却不行(或者我找不到输出..)

我无法输入5个星号,因为它会变成项目符号..但我在定时任务中有它们。

cd usr/local/sbin/cronjobs && . virtualenv/secret_ciphers/bin/activate && cd csgostatsbot && python3 CSGO_STATS_BOT_TASK.py && deactivate

2 个回答

1

试试这些命令。希望这样能让你的安排变得更简单、更容易理解:

$ sudo apt-get install python3 # Just in case you haven't already
$ sudo apt-get install python3-pip
$ sudo pip3 install praw
$ vi CSGO_STATS_BOT_TASK.py
«Ensure that "#!/usr/bin/env python3" is the first line»
$ chmod +x CSGO_STATS_BOT_TASK.py
$ crontab -e
* * * * * /path/to/CSGO_STATS_BOT_TASK.py
1

看起来你可能在命令中多加了一个.,这可能会导致命令出错。

试试这个:

cd usr/local/sbin/cronjobs && virtualenv/secret_ciphers/bin/activate && cd csgostatsbot && python3 CSGO_STATS_BOT_TASK.py && deactivate

假设virtualenv文件夹是在cronjobs文件夹里。

另外,你也可以跳过激活和停用,直接从virtualenv运行python3。也就是说:

/usr/local/sbin/cronjobs/virtualenv/secret_ciphers/bin/python3 /usr/local/sbin/cronjobs/csgostatsbot/CSGO_STATS_BOT_TASK.py

根据提问者的评论进行的编辑:

activate命令是用来激活virtualenv的。不太确定.会造成什么影响,除了可能导致命令解析的问题。

这两个例子都涉及到使用virtualenv。你不需要明确调用activate。只要你从virtualenv的目录中调用解释器,你就是在使用virtualenvactivate其实是一个方便的方法,它会调整你的PATH,让python3和其他的可执行文件指向virtualenv的目录,而不是系统的安装目录。

根据提问者的额外评论进行的第二次编辑:

你应该重定向stderr,也就是:

/usr/local/sbin/cronjobs/virtualenv/secret_ciphers/bin/python3 /usr/local/sbin/cronjobs/csgostatsbot/CSGO_STATS_BOT_TASK.py > /tmp/botlog.log 2>&1

看看这样能否提供更多信息。

另外,cron中的5个星号会让脚本每分钟运行一次,全年无休。你真的想这样吗?

根据提问者的额外评论进行的第三次编辑:

如果你希望它一直运行,我不确定你是否真的想用cron。即使是5个星号,它也只是每分钟运行一次。这意味着它并不是一直在运行。如果运行时间超过一分钟,可能会出现多个副本在运行(这可能会是个问题,也可能不是,取决于你的代码),如果运行得很快,比如几秒钟,你就得等到下一个分钟再运行。

听起来你想让这个脚本实际上成为一个守护进程。也就是说,只需在while (True)循环中运行主脚本,然后只需启动一次。这样你可以通过<crtl>+c来退出,否则它就会一直运行下去。

撰写回答