仅当 vpn 启动时才运行 cronjob/定期作业

仅当 vpn 启动时才运行 cronjob/定期作业

我有一个想要运行的脚本仅有的如果 VPN 已启动。

我可以在 VPN 启动和关闭时通过 OpenVPN 运行一项作业,但我希望在 VPN 启动时定期运行一项作业,而在 VPN 关闭时则根本不运行。

实现这一目标的最优雅方法是什么?

答案1

快速回答,以便问题得到一些结论:

我认为@user535733 的评论是最好的方法。VPN 在启动时被禁用,并在此系统中手动启动systemd disable openvpn

我已将以下内容添加到vpn-up.shVPN 启动后执行的脚本中systemctl start openvpn

#!/bin/bash

# Disable ipv6 to prevent leaks
echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6

# Start services e.g. transmission
service transmission-daemon start

# Heredoc for crontab entry in /etc/cron.d
MINUTE=`date +%M`
tee /etc/cron.d/piaport <<-EOF >/dev/null
    # /etc/cron.d/piaport: crontab entries for pia-port script

    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    ${MINUTE} * * * * root /usr/local/bin/pia-port >> /var/log/piaport.log 2>&1
EOF

该脚本启动并生成一个文件piaport/etc/cron.d该文件在生成一个脚本后一小时运行该脚本,之后每小时再次运行该脚本。

vpn-down.shVPN 服务停止时运行的脚本systemctl stop openvpn

#!/bin/sh

# Stop service like Transmission
service transmission-daemon stop

# Prevent DNS leaks 
/etc/openvpn/update-resolv-conf

# Reenable ipv6
echo 0 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6

# Remove cronjob / heredoc
rm /etc/cron.d/piaport

对于意外重启,cronjob 调用的脚本会检查 VPN 是否存在,/etc/cron.d/piaport如果存在则删除该 cronjob:

剧本的一部分

# Check for tun0
tuncheck=$( { /sbin/ifconfig tun0; } 2>&1 )

tunnotfound="not found"
if [ "${tuncheck/$tunnotfound}" = "$tuncheck" ] ; then
  echo "- VPN tunnel appears to be up and connected (Good!)"
else
  echo "Error detected! tun0 does not exist."
  echo "Please make sure both internet and the VPN is connected!"
  echo ""
  echo "Then run this script again!"
  echo ""
  [[ -f /etc/cron.d/piaport ]] && rm -f /etc/cron.d/piaport
  exit

总的来说,cronjob 仅在必要时以及 VPN 启动时运行。

相关内容