通过 cron 运行脚本时“找不到命令”

Wol*_*lfy 37 cron

我想在 crontab 中运行我的脚本,但我有一些问题...

在我的脚本中,我运行以下命令:

db2 connect to myDB2
Run Code Online (Sandbox Code Playgroud)

当我以db2inst1用户身份运行它时,这工作正常,但是当我在db2inst1 crontab 中运行此脚本时,我得到了这个:

db2:找不到命令。

我该如何解决这个问题?

Lek*_*eyn 55

为了避免输入命令的绝对路径,shell 引入了$PATH环境变量,每个目录用 a 分隔,:从左到右进行搜索。cron经常清除整个环境,包括这个$PATH变量。因此,与 shell 中的行为相比,脚本在您的 cron 中的行为可能有所不同。

使用绝对路径

which db2db2inst1用户身份运行以获取程序的完整路径db2。如果输出为/usr/bin/db2,则您的 cron 命令将如下所示:

/usr/bin/db2 connect to myDB2
Run Code Online (Sandbox Code Playgroud)

设置PATH变量

echo "$PATH"db2inst1用户身份运行以获取$PATH变量并确保该变量在您的 cron 脚本中也可用。例如,如果输出为/usr/local/bin:/usr/bin:/bin,则将下一行放在 shell 脚本的顶部:

export PATH="/usr/local/bin:/usr/bin:/bin"
Run Code Online (Sandbox Code Playgroud)


小智 11

正如在https://askubuntu.com/a/23438/227839 中回答的那样,你应该PATH在你的 shell 脚本中设置:

#!/bin/bash
PATH="/usr/local/bin:/usr/bin:/bin"

# rest of script follows
Run Code Online (Sandbox Code Playgroud)

或在 crontab 文件中,这将适用于所有 cron 作业:

PATH="/usr/local/bin:/usr/bin:/bin"
0 1 * * * db2 connect to myDB2
Run Code Online (Sandbox Code Playgroud)