Bash

Cron 作業中的 CasperJS 和 PHP 無法打開文件,手動執行時工作正常

  • July 21, 2015

我最近在 Ubuntu 中獲得了一個新的 DigitalOcean LEMP 環境。我嘗試製作一個使用 CasperJS 將數據從外部網站抓取到 JSON 文件的 SH 腳本,以及一個用於解析 JSON 並更新 MySQL 數據庫的 PHP 腳本。SH 由 cron 作業執行。我的 crontab 如下,意味著每 90 分鐘執行一次。

# m h  dom mon dow   command
0 0,3,6,9,12,15,18,21 * * * /bin/sh /usr/share/nginx/private/mpd_calls_for_service/scrape_mpd_calls_cron.sh
30 1,4,7,10,13,16,19,22 * * * /bin/sh /usr/share/nginx/private/mpd_calls_for_service/scrape_mpd_calls_cron.sh

有問題的 SH 文件是。

#!/bin/sh
/usr/local/bin/casperjs /usr/share/nginx/private/mpd_calls_for_service/scrape_mpd_calls.js
/usr/bin/php /usr/share/nginx/private/mpd_calls_for_service/parse_json_file.php

在 SSH 中通過終端單獨執行這些程式碼行可以正常工作。但是,當通過 SSH 或 Cron 手動執行 shell 腳本時,結果就是這樣。

無法打開文件:/usr/share/nginx/private/mpd_calls_for_service/scrape_mpd_calls.js 不安全的 JavaScript 嘗試使用 URL 訪問框架 about:blank from frame with URL file:///usr/local/lib/node_modules/casperjs/bin /bootstrap.js。域、協議和埠必須匹配。

不安全的 JavaScript 嘗試從帶有 URL file:///usr/local/lib/node_modules/casperjs/bin/bootstrap.js 的框架訪問具有 URL about:blank 的框架。域、協議和埠必須匹配。

無法打開輸入文件:/usr/share/nginx/private/mpd_calls_for_service/parse_json_file.php

我在過去兩天嘗試的解決方案包括

  1. 所有受影響文件的 CHMOD 777。
  2. 在 sudo 時編輯 crontab-e。
  3. 通過 npm -g 重新安裝 PhantomJS 和 CasperJS。

不過,經過多次嘗試,我陷入了死胡同,準備開始拔頭髮。社區的任何幫助將不勝感激。

我最終只是在帶有 && 的單個 crontab 行中執行命令,並在 bash -l -c 語句中執行,它現在可以工作了!

我也必須弄清楚這一點,但至少執行 casperjs 要求您有可用的變數,當您將 shell 作為登錄 shell 載入時會載入這些變數。就我而言,我不想在腳本中硬編碼 casperJS 的路徑,因為它已經在我的 mashine 的 $PATH 中設置了。這導致發現僅從 crontab(或在我的情況下為 ANT)生成 shell 不會載入 .rc 文件,因此沒有路徑。除此之外,casperJS 可能需要登錄 shell 中提供的更多變數。bash -l -c將 bash 作為登錄 shell 載入的方法也是如此。

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