2011-10-28 73 views
1

這是我第一次進入shell腳本,因此如果我提出一個非常基本的問題,請對我溫柔!從cron運行時,無法從shell腳本訪問for循環的代碼

我有一個shell腳本通過FTP下載文件,使用拆分將文件分解成單獨的較小文件。然後我使用for循環來調用一個PHP文件,該文件對文件進行一些處理,這個PHP進程在後臺運行完成。

這兩個腳本組合在sudo下的命令行運行正常,但是當它從cron運行時,我似乎無法獲得文件名值傳入PHP。

我2個測試腳本如下

shell-test.sh

#!/bin/bash 

cd /path/to/directory/containing/split/files/ 

#Split the file into seperate 80k line files 
split -l 80000 /path/to/file/needing/to/be/split/ 

#Get the current epoch time as all scripts will need to use the same update time 
epochtime=$(date +"%s") 

echo $epochtime 

#Output a list of the files in the directory 
ls 


#For loop to run through each file in the working directory 
#For each file we run the php script with safe mode off (to enable access to includes) 
#We pass in the name of the file and epochtime 
#The ampersand at the end of the string runs the file in the background in parallel so  that all scripts execute concurrently 

for file in * 
do 
php -d safe_mode=Off /path/to/php/script/shell-test.php -f $file -t $epochtime & 
done 

#Wait for all scripts to finish 
wait 

殼test.php的

<?php 

$scriptOptions = getopt("f:t:"); 

print_r($scriptOptions); 

?> 

當從命令行運行輸出作爲以下我需要什麼 - 將文件值傳遞給PHP腳本。

1319824758 
xaa xab xac xad 
Array 
(
[f] => xaa 
[t] => 1319824758 
) 
Array 
(
[f] => xac 
[t] => 1319824758 
) 
Array 
(
[f] => xad 
[t] => 1319824758 
) 
Array 
(
[f] => xab 
[t] => 1319824758 
) 

然而,當通過cron是輸出

1319825522 
xaa 
xab 
xac 
xad 
Array 
(
[f] => * 
[t] => 1319825522 
) 

下運行因此,我需要知道的是如何得到的值*作爲文件名,而不是實際的字符串*(以及爲什麼發生這種情況也會有用!)。

回答

2

我的隨機猜測是,cron使用-f選項運行shell以確保安全。嘗試將

set +f 

添加到您的腳本。或者找一些其他的方式來枚舉這些文件。

+0

偉大的作品 - 非常感謝!將不得不閱讀使用此選項更改運行cron的影響。有人可以推薦一個體面的資源爲這個特定主題的相對noob? – Sagaris