每天一到两次,当我正在构建的服务投入生产时,我必须读取位于 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