如何解决使用grep的bash脚本看起来正确吗?
我遇到一些奇怪的重启问题,我认为这是由于我的shell脚本错误所致。
#!/bin/bash
if ps -a | grep -q gridcoin
then
echo nothing
else
sudo reboot -h now
fi
脚本应该像这样工作:
运行ps -a命令,以列出所有进程。将结果传送到grep并进行grep检查,以查看其中是否有任何进程包含“ gridcoin”一词。如果gridcoin正在运行,则什么也不做。如果gridcoin不是正在运行的进程之一,请重新启动系统。
我有一个cron作业,每五分钟运行一次此脚本;但是,即使我知道Gridcoin正在运行,我的系统也大约每五分钟重启一次。
在开始尝试放牧其他代码猫之前,请先看一下代码,看看它是否正确。
恭喜,
查德里克
解决方法
我在这里至少看到两个问题。首先,ps -a
将不会显示没有控制终端的进程(因此,基本上是非交互式进程);您希望ps -ax
显示所有进程。
第二,根据时间的不同,grep -q gridcoin
命令可能会被列为正在运行的进程,它当然会找到自己,这意味着它将自己误认为是gridcoin进程。如果您有pgrep
程序,请用它替换ps
和grep
,因为它会自动避免列出自己。不幸的是,它没有像-q
这样的grep
选项,因此您必须将其输出重定向到/ dev / null:
if pgrep gridcoin >/dev/null
如果pgrep
不可用,则有两种标准的习惯用法可以阻止grep
自身:
if ps -ax | grep -q '[g]ridcoin' # Adding brackets prevents it from matching itself
if ps -ax | grep gridcoin | grep -vq grep # Remove grep processes from consideration
而且,正如David C. Rankin指出的那样,重新启动整个系统以重新启动一个进程是过大的;只需重新启动一个进程即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。