首页 > 解决方案 > 无法在 cgi 脚本中运行 find 和 xargs

问题描述

我有一个 cgi 脚本,它从 html javascript 获取请求并运行一些系统命令,然后响应回 javascript。现在在我的 cgi 脚本和 set 函数之一中,我有以下行代码。

$shred1 = `/usr/bin/find /usr/demo/logs -type f | xargs shred -uvz -n 5`;
$shred2 = `/usr/bin/find /var/lib/pgsql/data -type f | xargs shred -uvz -n 5`;

第一行,即“shred1”正在成功执行,但第二行“shred2”只是挂起,甚至不会返回任何错误。我在这里是否缺少任何东西,或者是否有任何其他方法可以实现相同的目标。谢谢你。

标签: bashcgi

解决方案


供将来参考:
这里的问题是shred在 cgi 执行中阻塞或填充了一些缓冲区或管道的输出。由于shred没有“安静”标志(根据手册页),解决方案是像这样运行它,将输出重定向到/dev/null

$shred1 = `/usr/bin/find /usr/demo/logs -type f | xargs -I{} bash -c "shred -uvz -n 5 {} &> /dev/null"`;
$shred2 = `/usr/bin/find /var/lib/pgsql/data -type f | xargs -I{} bash -c "shred -uvz -n 5 {} &> /dev/null"`;

如果出现问题可能来自被粉碎的文件过多,请使用-n-P标志来限制一次粉碎的文件数量。

如果 的输出shred很重要,而不是将其发送到 void,可以通过替换/dev/null日志文件的位置将其通过管道传输到文件,它应该存储在其中。
在这种情况下,日志文件是每次运行时都会覆盖。如果这不应该发生,请使用&>>而不是&>附加到日志文件(在这种情况下不要忘记不时轮换日志文件)。


推荐阅读