【问题标题】:Script doesn't work in crontab but works in the terminal脚本在 crontab 中不起作用,但在终端中起作用
【发布时间】:2019-09-30 23:49:58
【问题描述】:

我正在尝试在 Centos 5.5 的 crontab 中运行 bash 脚本,但我没有看到它作为 pid (pid -e) 运行。该脚本本身使用 awk 命令来监控关键字的运行日志,然后发送一封电子邮件,然后一旦服务器重新上线,它就会发送一封确认电子邮件:

tail -fn0 user | awk '
    !server_down && /disconnect_tcp_conn/ { 
        system("mail -s \"server down\" mail@gmail.com </dev/null") 
        print "server down"
        server_down = 1 }
    server_down && /daemon apps started/ {
        system("mail -s \"server's back!\" mail@gmail.com </dev/null") 
        print "Server's back!"
        server_down = 0 }' 

最初,我在终端关闭时无法运行脚本。有人建议通过以下方式使用setsid:

setsid server_mon.sh >/dev/null 2>&1 < /dev/null &

这很好用.. 直到它没有。出于某种原因,经过一天左右的时间后,脚本不再发送通知。所以,我想为脚本创建一个 cronjob。

不熟悉 bash shell,也不是一个程序员,我每分钟都在 cron 中测试脚本,看看我是否正确使用它:

* * * * *  /var/log/server_mon.sh

没用。它只会说:

"/tmp/crontab.XXXXmu99ii" 19L, 760C written
crontab: installing new crontab

尝试使用 rc.local.. 不能。我认为 centos 版本太旧(5.5),另外,crontab 可能是要走的路,因为我可能想知道通知似乎在什么时候停止工作并相应地设置一个 cron 工作.. 至少直到我有时间修复它。

尝试在脚本中添加 awk 命令的路径:/usr/bin/awk 还是没有pid。

尝试根据我在网上找到的内容添加以下更改:

setsid bash -lic 'cd /var/log && exec SLR_reaper.sh -start' </dev/null &>/dev/null &

没用,不知道对不对。

我的预期结果是:

setsid server_mon.sh >/dev/null 2>&1 < /dev/null &

不知何故被 crontab 触发:

@reboot /var/log/server_mon.sh

       *or*

* * * * * /var/log/server_mon.sh

只是为了看到它的工作。

任何方向或帮助都会很棒。如果您需要更多信息,请告诉我。谢谢!

发送到邮件的日志屏幕截图: enter image description here

【问题讨论】:

  • 试试* * * * * /bin/sh ./var/log/server_mon.sh
  • 刚试过。还是没有pid
  • 如果你没有将 stderr 重定向到 /dev/null 那么你可能不会说 For some reason wrt 为什么 setsid server_mon.sh &gt;/dev/null 2&gt;&amp;1 &lt; /dev/null &amp; 失败,因为它可能打印了它失败到 stderr 的原因。
  • @Ed Morton 好建议。我需要看看到底发生了什么
  • @EdMorton 是的!击中我朋友的头。

标签: linux bash shell awk centos


【解决方案1】:

所以解决方案非常简单。我只需要在脚本本身中提供脚本正在监视的文件的路径:

tail -fn0 /var/log/user | /usr/bin/awk '
    !server_down && /disconnect_tcp_conn/ {
        system("mail -s \"server is down XXX.XXX.XXX.XXX\" mail@gmail.com </dev/null")
        print "server is Down XXX.XXX.XXX.XXX"
        server_down = 1 }
    server_down && /daemon apps started/ {
        system("mail -s \"Server is up XXX.XXX.XXX.XXX\" mail@gmail.com </dev/null")
        print "Server is Up XXX.XXX.XXX.XXX"
        server_down = 0 }'

日志文件报告它找不到提示我这是路径相关问题的文件。

之前的脚本是:

tail -fn0 user | /usr/bin/awk '

现在我添加了完整路径:

tail -fn0 /var/log/user | /usr/bin/awk '

感谢@EdMorton 告诉我跟踪日志,然后在脚本中提供完整路径。我没有意识到这是必要的,因为脚本与“用户”位于同一目录中。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多