Linux

PHP 腳本未通過 cron 執行

  • May 6, 2020

雖然我檢查了 cron 的規範問題,但我無法解決問題。 為什麼我的 crontab 不工作,我該如何排除故障?

所以,我來了:

我有一個查詢 MySQL 和 IBM Informix 數據庫(位於其他主機)、生成 json 文件、處理資訊並將其插入 MySQL 數據庫的 php 腳本。

該腳本有一個主文件和另一個具有查詢處理功能的文件。保持這樣:

/opt/project
    script.php
    functions.php

script.php 需要 functions.php 文件和基因

我可以使用絕對或相對路徑順利執行腳本。

/opt/project 內部:

# php script.php

別的地方:

# /usr/bin/php /opt/project/scrpt.php

但是,當它由 cron 作業執行時,它不起作用。我確實已經設置了通知環境變數,執行了日誌測試,甚至創建了一個 shell 腳本來執行 script.php,而 cron 執行 shell 腳本。

伺服器路徑(CentOS 7):/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin

crontab 內容試過:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
*/14 * * * * /usr/bin/php /opt/project/script.php

使用 root 提前命令:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
*/14 * * * * root /usr/bin/php /opt/project/script.php

更改目錄:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
*/14 * * * * cd /opt/project && /usr/bin/php script.php

cron 直接執行 shell 腳本而不是 php:

SHELL=/usr/local/bin   
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
*/14 * * * * cd /opt/project && sh run_script.sh

其中shell腳本有以下內容:

#!/usr/bin/env bash

cd /opt/project

PHP=`which php`
$PHP script.php

cron 日誌沒有顯示任何錯誤,如果我將輸出重定向到文件,它會創建文件,但沒有執行 php 腳本,即使是通過 shell 腳本來執行。我嘗試在 crontab 中不設置 SHELL 和 PATH,但也不起作用。

問題是用於連接 IBM Infomix 數據庫的 SDK 變數。儘管我已經設置了 PATH,但還是需要從 IBM Informix 中導出我在安裝 Informix SDK 時定義的環境變數。奇怪的是,即使使用 PDO 異常,當我使用 &> 重定向錯誤標準輸出時也沒有生成任何錯誤。

可能存在一種最優雅的方式來做到這一點,但我不能在現場環境中玩耍。遵循目前有效的 cron 作業:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
14,29,44,59 * * * * root export INFORMIXSERVER=<data_source_name> && export INFORMIXDIR=<path_to_informix_sdk> && export INFORMIXTMP=<path_infomix_tmp> && export INFORMIXSQLHOSTS=<path_to_sqlhost_file> && export $PATH:$INFORMIXDIR/bin && /usr/bin/php /opt/project/script.php &> /var/log/project/task.log

引用自:https://serverfault.com/questions/990356