一个cron的环境问题-二更

2024-09-07 18:13:12 浏览数 (1)

背景

前文说到cron遇到的一个环境变量问题,这期再深究一下。

环境文件的类型

全局配置文件:这些文件通常位于 /etc 目录下,例如 /etc/profile 和 /etc/bash.bashrc。

用户级配置文件:这些文件位于用户的主目录下,例如 ~/.bash_profile、~/.bashrc、~/.profile。

  • 登录 Shell:当用户登录时,Bash 会按照以下顺序加载配置文件:
    1. /etc/profile(全局配置文件)
    2. ~/.bash_profile(用户级配置文件,如果存在)
    3. ~/.bash_login(如果 ~/.bash_profile 不存在且 ~/.bash_login 存在)
    4. ~/.profile(如果 ~/.bash_profile~/.bash_login 都不存在)我机器上这文件里面有内容,确定能有效果吗?

请注意,这里并没有加载~/.bashrc文件。但是我们打开~/.bash_profile文件,可以看到里面特地加载了bashrc文件:

在 Bash 中,~/.bash_profile 文件通常用于配置登录 Shell 的环境,而 ~/.bashrc 文件用于配置非登录交互式 Shell 的环境。通过在 ~/.bash_profile 中加载 ~/.bashrc 文件,可以确保登录 Shell 会话中也能使用 ~/.bashrc 文件中的配置(如别名和函数)。

所以当我们登录机器的时候,用户配置的bashrc内容是可以加载的。

那么,为什么cron的任务无法加载呢?

交互类型

机器交互可以分为四种类型:

1、非交互式的非登录 shell:

这种类型的 shell 通常在执行脚本或自动化任务时使用。

它不会读取用户的 .bash_profile.bash_login.profile 文件,但会读取脚本中的命令。

例如,当你运行一个 Bash 脚本或者当 cron 执行一个任务时,就会启动这种类型的 shell。

2、非交互式的登录 shell:

这种类型的 shell 在某些自动化的环境中可能会使用,例如在远程通过 SSH 执行命令

它会读取和执行 /etc/profile 和用户的 .bash_profile.bash_login.profile 文件。

例如,当你使用 SSH 命令远程执行一个命令时(如 ssh user@host command),就会启动这种类型的 shell。

3、交互式的非登录 shell:

这种类型的 shell 通常在已经登录的用户启动一个新的 shell 时使用。

它会读取和执行 /etc/bash.bashrc(在某些系统上可能是 /etc/bashrc 或其他路径)和用户的 .bashrc 文件。

例如,当你在终端中输入 bash 命令启动一个新的 shell 时,就会启动这种类型的 shell。

4、交互式的登录 shell:

这种类型的 shell 通常在用户登录系统时使用。

它会读取和执行 /etc/profile 和用户的 .bash_profile.bash_login.profile 文件。

例如,当你在终端模拟器中打开一个新的终端会话,或者通过 SSH 登录到远程系统时,就会启动这种类型的 shell。

cron的交互类型

cron属于第一种非交互式非登录shell,所以其不会加载bash_profile,所以不会加载bashrc,所以无法取到里面的环境变量。

如何使用

在cron执行的bash命令中,增加一个source ~/.bashrc即可。

那么,可以在系统文件中增加吗,比如/etc/profile中增加我们需要的环境变量?理论上可以,实际上不行。

1、不合适。你一个业务模块需要的环境变量,放到系统文件中不合适。这里放的都是系统级别的,比如jdk、maven配置等。

2、试过了,不起作用ORZ。

问题

在没有进行发布方式更改的时候,为什么cron能顺利执行?

来个三更?

0 人点赞