如果Crontab仅在某些时候需要输入,则可以使用它来管理包

时间:2017-12-28 06:24:30

标签: bash input cron pip conda

我基本上有一套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'? 我可以看到几个问题。

  1. 最迫切的是,如果cron到达需要输入的点,cron会崩溃,对吗?我自己还没有看到这个,但这是我读过的。
  2. 我不确定有多少次我需要提供输入,因为它总是变量哪些命令会有需要更新的程序,哪些不会,所以它不像我将永远需要输入3' s'并且它不像是相同的命令从运行到运行需要相同的输入。
  3. 这只是一个坏主意吗?

    我当前的crontab条目如下:

    0 10 1 * * source /Users/mycomputer/.bash_profile; /bin/sh /Users/mycomputer/Desktop/auto_package_updater.sh
    

1 个答案:

答案 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 - 启动时由initsystemd启动 - 并且不会崩溃(除非您遇到{{}中的错误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 脚本,当知道时,这样做是合理的如此。