为什么此脚本在从 cron 运行时失败,但在手动运行时有效?

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.

但是只要是第一次手动执行,它就可以正常工作。

Spi*_*iff 5

此类问题的通常答案是 cron 作业在非交互式、非登录 shell 中运行,因此您的大多数 shell 启动文件(包括系统范围内的文件/etc和主目录中的个人点文件)都没有来源(读入并执行),因为大多数 shell 启动文件适用于登录 shell(您登录计算机时看到的第一个 shell)或交互式 shell(连接到终端、ssh 会话或终端模拟器的 shell,因为用户是通过所述终端与他们互动)。

因此,如果您在 cron 作业中放置一个命令,而该命令实际上取决于某些环境设置(包括PATH更改),而这些环境设置通常发生在/etc/profile, /etc/bashrc, ~/.profile, 或等地方~/.bashrc,则该设置不会发生在 cron 作业中。cron 文件格式确实允许您为作业指定环境变量,因此您可能希望指定BASH_ENVENV将其指向 shell 启动脚本以获取源。请参阅bash(1)手册页的“调用”部分。