bash 脚本无法通过 crontab 按预期工作

bash 脚本无法通过 crontab 按预期工作

我正在使用sun Solaris 10哪个遗留系统,我制作了一个处理特定生产者的脚本,它由bash/perl/posix/sqlplus/awk大约 1k 行组成,在独立模式下工作正常,它会按预期工作,但存在一个问题,该脚本在 crontab 中不起作用通过 StackOverflow/stackunixexchange 遵循了很多建议,例如:

  1. 从舍邦开始#!/bin/bash
  2. 具有完全权限的脚本 777
  3. 正确的 crontab 时间语法
  4. 服务已重新启动
  5. 在 shell 顶部加载所有环境变量
  6. 在 crontab bash 中的脚本开头设置 bash

我的问题仅在该脚本上,其余脚本工作正常,可能是因为脚本必须在 bash 中,并且 crontab 默认使用 sh 或 crontab 加载最小环境变量运行

最后,我通过将所需的 shell 插入另一个 shell 并通过在 crontab 中设置新 shell 来通过新 shell 运行它来解决问题,在此步骤之后,我可以看到 crontab 工作正常,它可以运行脚本,但问题是脚本没有完成预期的工作,它会跳过bash statements像生产者if statements 这样的其他工作sqlplus/Perl statements您能告诉我如何解决这个问题吗?这个问题仅在将脚本安排到 crontab 时发生

crontab 中的 shell 看起来像:

10 10,16 * * 1,4 bash /rate/u01/WORK/MP/ERROR/USAGE_REJECTIONS/HolderUsageShell.sh

脚本开始如下:

#!/bin/bash 
#environment shell contains all environment variables, I have tried to run it with/without and I got the same thing
/rate/environment.sh >/dev/null

cd /rate/path/
CurrentHour=$(date +%I)
DAY_In_Word=$(date +%A)

if [[ "$DAY_In_Word" == "Monday" || "$DAY_In_Word" == "Thursday" ]] && [[ "$CurrentHour" == "10" ]]; then
.
.
.

答案1

您无法在子 shell 中更改环境:当子 shell 结束时,更改将丢失。子 shell 无法更改父 shell 的环境。您必须更改当前 shell 中的环境。对您的脚本进行以下更改:

/rate/environment.sh >/dev/null

应该

. /rate/environment.sh >/dev/null

相关内容