Bash

bash 腳本無法通過 crontab 按預期工作

  • April 8, 2020

我正在使用sun Solaris 10哪個遺留系統,我製作了一個處理特定生產者的腳本,它由bash/perl/posix/sqlplus/awk大約 1k 行組成,它在獨立模式下工作正常,它可以按預期工作,但是有一個問題是腳本在 crontab 中不起作用我通過 StackOverflow/stackunixexchange 遵循了很多建議,例如:

  1. 從shebang開始#!/bin/bash
  2. 具有完全權限的腳本 777
  3. 正確的 crontab 時間語法
  4. 服務重新啟動
  5. 在shell頂部載入所有環境變數
  6. 在 crontab bash 中的腳本開頭設置 bash

我的問題僅在該腳本上執行,其餘腳本工作正常,可能是因為腳本必須在 bash 中,並且 crontab 預設執行時使用 sh 或 crontab 載入最小的環境變數

最後,我通過將所需的 shell 插入另一個 shell 並通過在 crontab 中設置新 shell 來通過新 shell 執行它解決了這個問題,在這一步之後我可以看到 crontab 工作正常,它可以執行腳本,但問題是腳本沒有完成預期的工作,它像生產者一樣跳過其他工作/bash statementsif statements 能告訴如何解決這個問題,這個問題只有在將腳本調度到 crontab 時才會發生sqlplus``Perl statements

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
.
.
.

您不能在子shell 中更改環境:當子shell 結束時,更改將失去。子shell 不能改變父級的環境。您必須更改目前 shell 中的環境。對您的腳本進行此更改:

/rate/environment.sh >/dev/null

應該

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

引用自:https://unix.stackexchange.com/questions/578426