【问题标题】:Script with lsof works well on shell not on cron带有 lsof 的脚本在 shell 上运行良好,而不是在 cron 上运行
【发布时间】:2013-01-15 16:52:03
【问题描述】:

我有一个小脚本可以计算 Linux 上打开的文件并将结果保存到平面文件中。我打算每分钟在 Cron 上运行一次,以便稍后收集结果。脚本如下:

/bin/echo "Timestamp: ` date +"%m-%d-%y %T"` Files: `lsof | grep app | wc -l`"

而 crontab 是这样的:

*/1 * * * * /usr/local/monitor/appmon.sh >> /usr/local/monitor/app_stat.txt

如果我从 shell ./script.sh 运行,它运行良好并输出为:

Timestamp: 01-31-13 09:33:59 Files: 57

但在 Cron 上的输出是:

Timestamp: 01-31-13 09:33:59 Files: 0

不确定是否需要任何权限或类似权限。我也尝试过在 lsof 上使用 sudo,但没有运气。

有什么提示吗?

【问题讨论】:

  • Cron 从不同的目录运行你的脚本...

标签: linux shell cron lsof


【解决方案1】:

从你的工作命令行,做

which lsof
which grep
which wc
which date

获取每个命令的完整路径并将它们添加到您的 shell 脚本中,生成类似

/bin/echo "Timestamp: `/bin/date +"%m-%d-%y %T"` Files: `/usr/sbin/lsof | /bin/grep app | /bin/wc -l`"

或者您可以设置一个 PATH 变量以在脚本中包含缺失值,即

 PATH=/usr/sbin:${PATH}

此外,除非您希望您的脚本在真正的 Bourne Shell 环境中运行,否则请加入 90 年代初期并使用 $( cmd ... ) 形式进行 cmd 替换,而不是反引号。 1995 年出版的 Ksh 93 书指出,命令替换的反引号已被弃用;-)

IHTH

【讨论】:

  • 感谢 Shellter,正中目标!我已经使用 which 命令设置了路径,效果很好。非常感谢!说到哪个你知道为什么我得到不同的计数器: lsof | grep 应用程序 | wc -l 和: ls -l /proc/{PID}/fd/ | wc -l ?
  • 我不是专家,(我在没有 /proc/... 的系统上工作了多年;-)),但我不希望它们返回相同的值,因为您的限制lsofgrep apps 的输出,而我猜/proc/{PID}/fd 只是附加到当前进程的文件。我会尝试lsof | sort > lsof.out; ls -l /proc/.. | sort > procs.out; diff lsof.out procs.out 查看推动计数的原始数据。祝大家好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多