2014-01-22 63 views
0

我在執行unix腳本時遇到問題at php webscript中的job命令。 與at工作的PHP是這樣的:從PHP腳本unix`at`,在shell中工作,但不是從網絡中運行

$output=exec('echo "/usr/bin/perl /home/dir/test.pl" | /usr/bin/at now +1minute') 

這將罰款從shell命令提示符。我可以執行php腳本,運行atq以查看該作業已設置並且該作業屬於根。然後等待並確認test.pl腳本已經運行。 test.pl腳本對數據庫執行一個簡單的更新,我可以檢查以確認一切正常。

當我從網上執行php腳本時,回到我的shell並再次運行atq。我可以看到工作已經完成,這次工作屬於apache,所以一切看起來都很好。但是在等待預定的時間之後,test.pl腳本不會執行,我可以在看到db的更新沒有奏效之後再進行確認。

我相信這一定是一個權限問題,但我不確定。我嘗試給/ home/dir和test.pl腳本所有權到Apache,但這仍然無法正常工作。我試圖在webroot文件夾中創建一個符號鏈接到/ home/dir,但這似乎也沒有幫助。我不知道Apache的權限,所以我可以忽略一些東西。

這裏是目錄和test.pl ls -l輸出中

/home/dir 
drwxrwxr-x 2 apache apache 

test.pl 
-rwxr-xr-x 1 apache apache 

感謝在這一個任何幫助。

+0

我可能會誤解,但你可以嘗試將'test.pl'的權限改爲'chmod 777'。另外,Apache通常不具有所有權,管理員或用戶可以。 –

回答

0

如果工作正在排隊,那麼我們可以打折apache uid被拒絕訪問'at'的可能性。

這就意味着作業可能無法執行(你怎麼知道它不能運行?)

既然你有root權限,下一步將是看看郵件文件的阿帕奇UID - 或確定在此UID郵件被髮送,並期待有:從man page

用戶將被郵寄標準錯誤和標準輸出從他的命令, 如果有的話。郵件將使用發送的命令/ usr/sbin目錄/ sendmail的

(如果你沒有找到任何東西在那裏,那麼你可能想嘗試像pwd | mail -s test apache或運行在與-m檢查郵件並獲得處理,因爲它應該)

通常一個守護程序的所有者將不會有任何配置的外殼 - 您在調用之前設置$外殼嗎? (如果是這種情況並且郵件正在發送,則會有相應的錯誤等待讀取)。

您已經檢查了test.pl文件的權限,但似乎沒有問題(假設沒有應用fACL或SELinux限制)。你檢查過perl可執行文件的權限嗎?可以test.pl試圖訪問它可能有權限的其他文件?

+0

似乎郵件沒有正確處理,至少當我嘗試'pwd | mail -s test myusername'我沒有收到郵件。如果'at'使用$ SHELL來確定使用哪個shell(當我以root用戶或任何其他用戶身份運行時,它是/ bin/bash)是否有可能在我從apache運行時沒有設置SHELL並且當入隊的'在'作業運行它沒有外殼使用? – BryanK

+0

如果沒有爲用戶配置一個,則只需設置$ SHELL =請參閱/ etc/passwd。注意如果你的Apache沒有shell不要更改/ etc/passwd - 在運行之前設置$ SHELL。並修復你的郵件。 (請記住,您正在嘗試爲Apache uid清理RECEIVING MAIL) – symcbean