2016-04-27 71 views
4

我有我的php腳本文件在/var/www/html/dbsync/index.php。當cd /var/www/html/dbsync/和運行php index.php它完美的作品。cronjob不執行獨立運行的腳本

我想打電話給通過SH文件PHP文件,SH文件的位置是如下

/var/www/html/dbsync/dbsync.sh 

這是dbsync.sh文件的內容是:

/usr/bin/php /var/www/html/dbsync/index.php >> /var/www/html/dbsync/myscript.log 2>&1 -q -f 

當我cd /var/www/html/dbsync/和運行./dbsync.sh它也可以很好地工作。現在

如果我設置瞭如下的crontab:

1 * * * * /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync 

然而,這個crontab工作不正常。

什麼可能是錯的?

+0

什麼是第二個/ var/www/html/dbsync的? – user3772314

+0

/var/www/html/dbsync - dbsync是保存index.php和dbsync.sh文件的目錄。 – sanainfotech

+0

現在我想嘗試每一秒。稍後如果需要的結果執行,我會設置爲每天午夜 – sanainfotech

回答

5

正如在註釋中看到的,問題在於您沒有定義應該使用什麼程序來執行腳本。考慮到cronjob是在微小的環境中執行的;在那裏,可以假設的不多。這就是爲什麼我們定義完整路徑等

所以,你需要這樣說:

1 * * * * /bin/sh /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync 
#   ^^^^^^^ 

/bin/sh是要用來執行腳本的二進制文件。

否則,您可以設置執行權限的腳本,並添加shell-script header告訴它使用什麼樣的解釋:

#!/bin/sh 

如果你做到這一點,添加的二進制文件的路徑是沒有必要的。

Troubleshooting common issues with cron jobs

使用相對路徑。如果您的cron作業正在執行一些 類型的腳本,則必須確保在該腳本中僅使用絕對路徑。 例如,如果你的腳本位於/path/to/script.phpand 你試圖在同一目錄中打開一個名爲file.php的文件, 你不能使用相對路徑,如fopen(file.php )。該文件必須從其絕對路徑調用,如下所示:fopen(/path/to/file.php)。 這是因爲cron作業不一定從腳本所在的目錄 運行,所以必須專門調用所有路徑。


而且,我知道你想運行此的每一分鐘。如果是這樣,1 * * * *不會。 Intead,它將運行at every 1st minute past every hour。所以如果你想每分鐘運行一次,就說* * * * *

+0

謝謝@fedorqui這工作非常好,我會記住提及哪個程序應該用來執行腳本。 – sanainfotech

+0

@sainainfotech歡迎你:)你提供了很多細節,所以我試圖讓答案通用到足以在其他情況下用作參考。 – fedorqui

1

理解「登錄shell」和「交互式shell」的含義非常重要。

  • 登錄shell:簡單地當您使用ssh會話登錄並獲取可輸入shell命令的終端窗口時。登錄後,系統執行一些文件(.bashrc)併爲您設置一些環境變量,例如PATH變量。
  • 交互式shell:登錄系統後,可以手動啓動shell終端。系統執行一些分配給您帳戶的配置文件(.bash_profile,.bash_login,.profile)。這些文件還會爲您手動打開的shell會話設置一些環境變量並初始化PATH變量。

通過OS啓動shell腳本和cron作業不符合上述提到的啓動shell的方式。因此,不會執行任何系統腳本(.bashrc)或用戶配置文件。這意味着我們的PATH變量沒有被初始化。因爲PATH變量沒有指向正確的位置,所以找不到Shell命令。

這解釋了爲什麼腳本在手動啓動時成功運行,但是當您通過crontab啓動它時會失敗。

解決方案-1: 使用每個shell命令的絕對路徑,而不是隻使用腳本文件中使用的命令名稱。

  • ,而不是 「awk的」 使用 「的/ usr/bin中/ AWK」
  • ,而不是 「sed的」 使用 「/斌/ sed的」

解決方案2:初始化環境變量特別是執行shell腳本之前的PATH變量!