我基本上有一套python包,二进制文件和其他需要不断更新的程序,我想看看是否可以创建一个运行BASH脚本的crontab条目,该脚本基本上每月运行这些更新。我已成功创建了一个crontab条目,该条目调用了我为此目的编写的较短的测试脚本。脚本不是问题,但如果它有助于回答我怀疑的问题,则如下所示。
#!/bin/bash
#Program update automator script
#Leveraging crontab to update all my neuroimaging, python, and conda packages monthly without having to do it myself because I forget and am a lazy POS
#Note - Am Using Conda and Pip for package management and not apt-get, which I don't think I have installed because I had read somewhere you can get discrepancies in processes if you have apt-get and one of the other ones both on the system
#Created 12.27.17
#Updated 12.27.17
#Updates Conda itself and cleans unused packages and tarballs out
conda update conda && conda update anaconda && conda clean --packages --tarballs
#Update AFNI binaries
@update.afni.binaries -defaults -do_extras
#Updating important Python libraries
conda update python ipython ipython-notebook matplotlib networkx numpy scipy sphinx traits dateutil nose pydot
#Update Nipype libraries
pip install --upgrade nibabel nipype rdflib nipy dipy pygraphviz graphviz
因为我在进行此条目之前刚刚运行了所有这些命令,所以测试它会导致它无错误地运行。问题是,当我在需要更新时只运行一些这些更新时,你得到了整体:
将更新以下软件包:继续([y] / n)? ÿ
这需要用户输入。 有没有办法可以自动化输入' y'? 我可以看到几个问题。
这只是一个坏主意吗?
我当前的crontab条目如下:
0 10 1 * * source /Users/mycomputer/.bash_profile; /bin/sh /Users/mycomputer/Desktop/auto_package_updater.sh
答案 0 :(得分:1)
crontab(5)条目描述了要定期运行的命令(或者,在引导时使用@reboot
)。这些命令由/bin/sh
(POSIX shell,请参阅sh(1p) ...)解释,事先替换%
字符。
请注意,这些命令在不同的环境中运行(请参阅environ(7) ...),而不是交互式shell。因此,您可能需要在LD_LIBRARY_PATH
shell脚本(而不是auto_package_updater.sh
中明确设置PATH
variable(以及可能需要的其他环境变量,例如source /Users/mycomputer/.bash_profile
) 闻起来很糟糕 ......)。
如果cron到达需要输入的点,那么cron会崩溃,
不,cron(8)是daemon - 启动时由init或systemd启动 - 并且不会崩溃(除非您遇到{{}中的错误1}}本身,这是非常不可能的)。它总是运行(如果你崩溃 - 这是非常不可能的,你之后不能运行任何cron
工作)。可能会发生的是您的特定cron作业被阻止......
有没有办法可以自动化输入' y'?
您可以考虑使用yes(1)(发出可能无限的crontab
行流)和pipe其输出(请参阅pipe(7))。例如,如果y
可能需要许多pip install --upgrade nibabel nipype
,则可能会放入shell脚本中:
y
(但要小心!你确定你总是想要吗?)
顺便说一句,我不确定完全自动化软件更新是否明智。您如何处理这些更新的失败或对错误版本的更新?我建议自动下载,但手动更新....你应该避免在该程序运行时更新Python程序....也许您只想编写自己的更新shell script(以避免输入重复的命令),但自己运行yes | pip install --upgrade nibabel nipype
脚本,当知道时,这样做是合理的如此。