/usr/local/bin 中的 crontab 和二进制文件

Abr*_*ile 13 bash environment-variables crontab

我正在工作,Redhat并且在/usr/local/bin我想crontabroot用户调用的文件夹中几乎没有程序。我认为通过将二进制文件放在该文件夹中就足以像在 shell 中一样直接调用程序。

基本上我每次都需要指定文件夹,所以下面的 crontab 不起作用

 5 9  * * 1,2,3,4,5 my_bin some_args
Run Code Online (Sandbox Code Playgroud)

但我把它改成

 5 9  * * 1,2,3,4,5 source ~/.bashrc; /usr/local/bin/my_bin some_args
Run Code Online (Sandbox Code Playgroud)

你知道为什么吗?

我采购的原因bashrc是添加一些环境库,特别是LD_LIBRARY_PATH因为我的二进制文件无法从/usr/local/lib.

Gor*_*son 19

cron 作业在非常小的环境中运行,并且由于它们是在crond没有 shell的情况下直接执行的(除非您强制创建一个),因此常规的 shell 设置永远不会发生。有两种标准的方法可以解决这个问题。首先,您可以在 crontab 中定义环境变量(请注意,这些将适用于所有作业——至少,在定义之后列出的那些):

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
LD_LIBRARY_PATH=/usr/local/lib

5 9  * * 1,2,3,4,5 my_bin some_args
Run Code Online (Sandbox Code Playgroud)

其次,您可以编辑脚本以减少对其环境的依赖(例如,让它定义自己需要什么),然后在 crontab 条目中使用完整路径:

5 9  * * 1,2,3,4,5 /usr/local/bin/my_bin some_args
Run Code Online (Sandbox Code Playgroud)

  • 我决定这样做: `0 0 * * * /bin/bash -l -c "PATH=\"$PATH:/usr/local/bin\"; <your command here>"` (2认同)
  • 附注:Ubuntu 上的 cronjobs 中的“$PATH”仅包含“/usr/bin:/bin” (2认同)