JVC*_*JVC 3 linux bash cron ubuntu
我有一个相对简单的 bash 脚本,在直接调用时效果很好,但在由 cron 运行时失败。为什么这会失败,我如何通过 cron 使其工作?
#!/bin/bash
apt-get update -y
apt-get upgrade -y
apt-get install boinc-client -y
Run Code Online (Sandbox Code Playgroud)
一旦 cron 尝试运行它,手动调用将导致此错误:
dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
但是只要是第一次手动执行,它就可以正常工作。
此类问题的通常答案是 cron 作业在非交互式、非登录 shell 中运行,因此您的大多数 shell 启动文件(包括系统范围内的文件/etc
和主目录中的个人点文件)都没有来源(读入并执行),因为大多数 shell 启动文件适用于登录 shell(您登录计算机时看到的第一个 shell)或交互式 shell(连接到终端、ssh 会话或终端模拟器的 shell,因为用户是通过所述终端与他们互动)。
因此,如果您在 cron 作业中放置一个命令,而该命令实际上取决于某些环境设置(包括PATH
更改),而这些环境设置通常发生在/etc/profile
, /etc/bashrc
, ~/.profile
, 或等地方~/.bashrc
,则该设置不会发生在 cron 作业中。cron 文件格式确实允许您为作业指定环境变量,因此您可能希望指定BASH_ENV
或ENV
将其指向 shell 启动脚本以获取源。请参阅bash(1)
手册页的“调用”部分。