如何在树莓派或其他Unix系统上编写多命令的cron作业
我正在尝试在Python 3中运行一个定时任务脚本,所以我需要设置一个虚拟环境(如果有更简单的方法,请告诉我)。为了运行这个脚本,我需要在脚本的父文件夹中,因为它会在那儿写入文本文件。以下是我想出来的一长串命令,它在控制台中可以正常工作,但在定时任务中却不行(或者我找不到输出..)
我无法输入5个星号,因为它会变成项目符号..但我在定时任务中有它们。
cd usr/local/sbin/cronjobs && . virtualenv/secret_ciphers/bin/activate && cd csgostatsbot && python3 CSGO_STATS_BOT_TASK.py && deactivate
2 个回答
试试这些命令。希望这样能让你的安排变得更简单、更容易理解:
$ 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
看起来你可能在命令中多加了一个.
,这可能会导致命令出错。
试试这个:
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的目录中调用解释器,你就是在使用virtualenv。activate其实是一个方便的方法,它会调整你的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
来退出,否则它就会一直运行下去。