在 Ubuntu 16.04 上安装看门狗

在 Ubuntu 16.04 上安装看门狗

我有一台位于 NAT 后面的 PC,它与我的 Digitalocean VPC 建立反向 SSH 连接。我利用这个反向 SSH 连接从家里登录我的办公室 PC(我被授权这样做)并复制文件并执行其他重要操作。

虽然不常见,但我注意到我的办公室电脑会重新启动(由于电源故障等原因)并断开与我的 VPC 建立的反向 SSH 连接。在这种情况下,我无法从家用电脑连接到办公室电脑。

我运行以下脚本来建立反向连接+动态代理,以匿名化我在办公室电脑上生成的流量(因为我不需要共享浏览信息)。

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

由于我并不在办公室,因此无法在办公室 PC 重启后再次运行此脚本。为了解决这个问题,我安装了以下 crontab。

注意:rev.sh文件包含上述行。证书“digitalOcean”和 rev.sh 位于Ubuntu home。因此,当我./rev.sh在 Ubuntu 终端中执行时,我获得了动态代理,并可以访问我的 DigitalOcean 服务器。此方法 100% 有效。

但是当我按照以下方法安装 crontab 时,我的 ubuntu PC 从未创建动态代理。我之所以能看到这一点,是因为当我从 Google Chrome 检查此代理时,它显示代理拒绝连接。

以下是我尝试过的 root cronjobs。我也以普通用户身份尝试过这些,但仍然不起作用。

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

然后,我在当前时间前几分钟安装了一个 crontab 并等待它执行。

24 12 * * * bash /home/user/rev.sh
24 12 * * * /home/user/rev.sh
24 12 * * * reboot 

这些也没有执行。

我也试过了48 15 * * * bash /home/user/rev.sh >> test3*/1 * * * * reboot -f >> test但 test3 和 test 什么都没有。但是文件已经被创建了!!由 crontab 创建!

请帮我找出我的错误。这个网站上有很多与我的问题类似的问题。我参考了很多答案,但似乎都没有帮助。

答案1

更好的解决方案是使用看门狗。看门狗是一个守护进程,它将监视正在运行的进程,如果它们退出,它将自动重新启动它们。

在 Ubuntu 16.04 上安装看门狗

sudo apt-get install watchdog

看门狗如何工作

watchdog(8)守护进程将/etc/watchdog.d使用参数test或执行脚本repair。(见TEST DIRECTORYwatchdog(8)手册页部分)。您的看门狗脚本在检查某个进程是否正在运行并采取措施修复它时,会处理这两个参数。

您可以通过修改来配置看门狗/etc/watchdog.conf(参见watchdog.conf(5))。

示例watchdog.d脚本

举例来说/etc/watchdog.d/autossh_script(具有755权限并且归 所拥有root)。

注意:您可能需要$targetuser在示例脚本中自定义环境变量。 sam是我的用户名。

#!/bin/bash

targetuser=sam

runTest=false
runRepair=false

case $1 in
  test)
    runTest=true
  ;;
  repair)
    runRepair=true
    repairExitCode=$2
  ;;
  *)
    echo 'Error: script needs to be run by watchdog' 1>&2
    exit 1
  ;;
esac

if ${runTest}; then
  #run a test here which will tell the status of your process
  #the exit code of this script will be the repairExitCode if it is non-zero
  if ! pgrep autossh &> /dev/null; then
    #autossh not running; notify watchdog to repair
    exit 1
  else
    #autossh running; no action necessary
    exit 0
  fi
fi

if ${runRepair}; then
  #take an action to repair the affected item
  #use a case statement on $repairExitCode to handle different failure cases
  su - ${targetuser} -c 'nohup autossh -f -- -NCD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC'
  exit 0
fi
  • 我在示例脚本中添加了-N您的ssh命令,因此它仅启动隧道但不会尝试创建登录 shell。
  • 我添加了-fautossh以便它在后台运行。
  • 示例脚本使用了一个简单的pgrep模式。但是,您可以进一步将测试范围缩小到特定用户,甚至可以为该过程使用模式。请参阅pgrep(1)了解如何使用 pgrep 进一步定制您的测试。

配置看门狗

/etc/watchdog.conf/etc/defaults/watchdog配置看门狗的地方。请参阅watchdog.conf(5)

需要注意的是,默认情况下,用户脚本每秒执行一次。我建议将其增加到至少 30 秒,除非您需要更多实时检查。interval在 中调整设置watchdog.conf

故障排除

您可能需要/etc/watchdog.d在脚本之前创建目录。

/var/log/watchdog/*包含与看门狗相关的日志和错误。如果您的脚本输出到 stdout 或 stderr,那么它将被写入那里。在我的系统上,我注意到我的脚本大约每秒执行一次。如果您在脚本中使用 echo,testrepair应该只是暂时的,仅用于调试目的。否则,建议丢弃输出,除非出现错误。

如果您的脚本根本没有运行,那么请检查权限:ls -l /etc/watchdog.d

相关内容