我的目标是编写一个可以通过 cron 作业执行的脚本。
该脚本需要在多个目录中找到多个killstat.php文件并执行。
这是我目前所拥有的:
#!/bin/bash
NAMETOFIND=$(find /home/ -name "killstat.php")
for i in $NAMETOFIND; do /usr/bin/php -f $i;
done
应该执行 killstat.php 来重置我的统计数据。但似乎 php 文件未执行。当我将 -f 开关更改为 -l(语法错误检查)时,脚本执行正常!
php killstat.php
从 CLI 执行也很好,并重置了统计信息。我以 root 身份运行,并且 killstat.php 和我的脚本都归 root 所有。脚本的 chmod 为 4755
Hastur 提供了略加改动的解决方案。
我将此脚本放在 /etc/cron.monthly 中以重置我的统计数据。
#!/bin/bash
find /home -name "killstat.php" | while read i
do
Cdir=$(dirname "$i")
Cname=$(basename "$i") # This line can be avoided..
cd "$Cdir"
/usr/bin/php -f "$Cname"; # ...if here you use killstat.php [1]
cd -
done
答案1
path
如果找到的文件中含有空格,则可能会出现问题。
尝试使用while read do ... done
如下循环:
#!/bin/bash
find /home/ -name "killstat.php" | while read i
do
/usr/bin/php -f "$i";
done
注意双引号“在/usr/bin/php -f "$i";
如果你的脚本需要从他的住处
#!/bin/bash
find /home/ -name "killstat.php" | while read i
do
Cdir=$(dirname "$i")
Cname=$(basename "$i") # This line can be avoided...
cd "$Cdir"
/usr/bin/php -f "$Cname"; # ...if here you use killstat.php [1]
cd -
done
再次注意双引号,以防$i
目录字符串中有空格。
实际上不需要双引号,$Cname
因为您知道在本例中是killstat.php
。
[1] 您可以直接替换killstat.php
,$Cname
并避免在脚本中写入所有包含 Cname 的行。