使用连接/断开 VPN 来包装 Bash 脚本调用

使用连接/断开 VPN 来包装 Bash 脚本调用

每天一到两次,当我正在构建的服务投入生产时,我必须读取位于 VPN 后面的数据库。

现在,在开发阶段,我一直在做以下事情。作为root用户,我运行:

openfortivpn -c /etc/openfortivpn/config

然后,以web用户身份运行:

sh manage.sh sync_master

哪里manage.sh

. /web/.env;. /web/bin/activate;/web/bin/python /web/src/manage.py $1 $2 $3

同步发生后,我返回root用户并在screen保持 VPN 连接打开的情况下使用 停止它ctrl+c

现在我需要从 crontab 运行它。所以我的问题有两个:这是一种好方法吗?我如何将所有这些逻辑放入 bash 脚本中?

谢谢!

PS:在 Ubuntu 18.04.1 LTS 上运行

答案1

建议编写一个 systemd.service 来启动|停止 VPN 并systemctl在脚本中使用。

答案2

在 Linux 中启动/停止/重新启动进程的正确方法是通过 PID 文件跟踪它。这是一个您可以开始使用的示例脚本。好消息是,下面的脚本也有一个 varify 部分,因此您可以将其放入 cron 中,"/path/to/scriptname varify"如果 openvpn 未运行,它将启动它。

#!/bin/bash

DAEMON_PATH="/full/path/to/"
DAEMON="/full/path/to/openfortivpn"
DAEMONOPTS="-c /etc/openfortivpn/config"

NAME=openfortivpn
DESC="openfortivpn"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

case "$1" in
start)
        printf "%-50s" "Starting $NAME... "
        echo  "Starting $NAME... " 
        cd $DAEMON_PATH
        PID=`$DAEMON $DAEMONOPTS & echo $!`
        echo "Saving PID" $PID " to " $PIDFILE
        if [ -z $PID ]; then
            printf "%s\n" "Fail"
        else
            echo $PID > $PIDFILE
            printf "%s\n" "Ok"
        fi
;;
status)
        printf "%-50s" "Checking $NAME..."
        if [ -f $PIDFILE ]; then
            PID=`cat $PIDFILE`
            if [ -z "`ps axf | grep ${PID} | grep -v grep`" ]; then
                printf "%s\n" "Process dead but pidfile exists"
            else
                echo "Running"
            fi
        else
            printf "%s\n" "Service not running"
        fi
;;
stop)
        printf "%-50s" "Stopping $NAME"
        echo "Stopping $NAME" 
            PID=`cat $PIDFILE`
            cd $DAEMON_PATH
        if [ -f $PIDFILE ]; then
            kill -HUP $PID
            printf "%s\n" "Ok"
            rm -f $PIDFILE
        else
            printf "%s\n" "pidfile not found"
            pkill -f "openfortivpn"
        fi
;;
varify)
        printf "%-50s" "Checking $NAME..."
        if [ -f $PIDFILE ]; then
            PID=`cat $PIDFILE`
            if [ -z "`ps axf | grep ${PID} | grep -v grep`" ]; then
                printf "%s\n" "Process dead but pidfile exists"
                echo "restarting..."
                $0 restart
            else
                echo "Running"
            fi
        else
            printf "%s\n" "Service not running"
            echo "starting..."
            $0 restart
        fi
;;

restart)
        $0 stop
        $0 start
;;

*)
        echo "Usage: $0 {status|start|stop|restart|varify}"
        exit 1

相关内容