【问题标题】:Terminal Application to Keep Web Server Process Alive使 Web 服务器进程保持活动状态的终端应用程序
【发布时间】:2015-09-20 05:15:56
【问题描述】:

是否有一个应用程序可以在给定命令和选项的情况下在进程的生命周期内执行并在特定时间间隔内无限期地 ping 给定 URL?

如果没有,这可以在终端上以bash script 的形式完成吗?我几乎可以肯定它可以通过终端实现,但不够流畅,无法在几分钟内完成。


发现 this post 包含解决方案的一部分,减去 ping 位。 ping 无限期地在 linux 上运行;直到它被主动杀死。在说两次 ping 之后,我将如何从 bash 中杀死它?

【问题讨论】:

  • 您是否熟悉while 循环以及如何在程序/脚本中使用sleep
  • 是的,javascript setInterval \ setTimeoutc#Thread.Sleep ...

标签: bash terminal zsh


【解决方案1】:

假设您想使用wget 开始下载,并在运行时ping url:

wget http://example.com/large_file.tgz & #put in background
pid=$!
while kill -s 0 $pid #test if process is running
do
    ping -c 1 127.0.0.1 #ping your adress once
    sleep 5 #and sleep for 5 seconds
done

【讨论】:

  • 这毫无意义。你为什么要这样做?
  • 我强烈建议使用存储在$! 中的PID,而不是命令的名称。因为这将使用管道失败。
  • 好多了,我喜欢你使用kill的方法!
  • 当主机宕机时,ping 将永远挂起。 (在大多数情况下)。 Wget 已经从该服务器产生流量 - 那么为什么要循环 ping 呢?
  • @hek2mgl 你为什么一直问这个脚本的目的是什么,你应该在评论他的问题时询问 OP。此脚本的目的是回答 OP 的问题并提供他/她需要的功能。
【解决方案2】:

通用脚本

正如其他人所建议的,在伪代码中使用它:

  1. 执行命令并保存PID
  2. PID 处于活动状态时,ping 和睡眠
  3. 退出

这会产生以下脚本:

#!/bin/bash

# execute command, use '&' at the end to run in background
<command here> &

# store pid
pid=$!

while ps | awk '{ print $1 }' | grep $pid; do
    ping <address here>
    sleep <timeout here in seconds>
done

请注意,&lt;&gt; 中的内容应替换为实际内容。无论是命令还是 IP 地址。

打破循环

要回答您的第二个问题,这取决于循环。在上面的循环中,只需使用变量跟踪循环计数。为此,请在循环内添加 ((count++))。并这样做:[[ $count -eq 2 ]] &amp;&amp; break。现在,当我们第二次 ping 时,循环将中断。

类似这样的:

...
while ...; do
    ...
    ((count++))
    [[ $count -eq 2 ]] && break
done

ping 两次

要仅 ping 几次,请使用 -c 选项:

ping -c <count here> <address here>

例子:

ping -c 2 www.google.com

使用man ping 了解更多信息。

更好的做法

正如hek2mgl 在下面的评论中指出的那样,当前的解决方案可能不足以解决问题。在回答问题的同时,核心问题仍然存在。为了解决这个问题,建议使用 作业,其中定期发送简单的 http 请求。这会产生一个相当简单的脚本,只包含一行:

#!/bin/bash
curl <address here> > /dev/null 2>&1

此脚本可以添加为cron job。如果您想了解有关如何设置此类计划作业的更多信息,请发表评论。特别感谢hek2mgl 分析问题并提出合理的解决方案。

【讨论】:

  • 当我从终端执行ping [host] 时,它会无限期地执行。我只希望它执行一次(或两次),然后在整个睡眠命令长度内停止。你会如何“阻止”ping
  • 这个脚本的目的是什么?
  • @cultureanomoly 只需要几次 ping,请使用 ping -c &lt;count&gt;。看我的回答。
  • ping 在这方面有何帮助? ping 不会产生 http 流量。只需在 cronjob 中执行 wget 即可。更好的办法是配置你的“农场”,让网站保持活力。
  • @cultureanomoly 这取决于是什么导致服务器死亡,如果任何传入请求阻止它死亡,那么这将起作用。如果不按照 hek2mgl 的建议使用 wgetcurl 执行 cron 工作。 - 我将在答案中详细说明。
【解决方案3】:

一个不错的通用小工具是Daemonize。其相关选项:

Usage: daemonize [OPTIONS] path [arg] ...

-c <dir>       # Set daemon's working directory to <dir>.
-E var=value   # Pass environment setting to daemon. May appear multiple times.
-p <pidfile>   # Save PID to <pidfile>.
-u <user>      # Run daemon as user <user>. Requires invocation as root.
-l <lockfile>  # Single-instance checking using lockfile <lockfile>.

这是一个使用中启动/杀死的示例:flickd

为了更复杂,您可以将您的 ping 脚本转换为 systemd service,它现在已成为许多最新 Linux 的标准。

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多