我的 VPN 有时会出现异常,我不得不经常重启它。我想编写一个脚本来帮我完成这项工作。它不需要花哨,只是我必须在终端中输入的命令的快捷方式。更具体地说:它将查看正在运行的进程。如果它发现正在运行的 vpnc 进程,它将终止它。然后它将启动 vpnc。
我写过类似复杂度的 bash 脚本,但现在我没有 bash,只有 ash。到目前为止,我注意到的唯一区别是可用的命令少了很多,但我并不经常使用它。所以我有一些问题。
- 编写 ash 脚本与编写 bash 脚本有何不同?
- 在做这件事时有什么特别需要考虑的吗?
- 脚本准备好后,我该如何部署它?对于 bash,我只需将可执行文件放在 /usr/lib 下,然后在命令行中输入文件名来运行它,这适用于 ash 吗?
- 在我要编写的脚本中,有什么需要注意的特殊陷阱吗?我认为,如果我编写了某些程序来终止错误的进程,终止进程部分可能会变得棘手,但即使这样,运行脚本也不会永久破坏任何东西,对吗?
答案1
我怀疑这里面有没有 bash 特有的东西,大部分“魔法”都在外部命令中。因此,类似的东西:
#!/bin/ash
pgrep vpnc >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
/etc/init.d/vpnc stop
sleep 1
pkill vpnc
sleep 1
pkill -9 vpnc
sleep 1
/etc/init.d/vpnc start
fi
假设您已安装 pgrep 和 pkill,并且您的 init 脚本被调用vpnc
并位于/etc/init.d
(并且ash
位于/bin
),则它将起作用。将其放在 中的任意位置$PATH
,设置执行位 ( chmod +x myscript
),您只需通过您保存的名称来调用它即可。
传统上,本地安装的二进制文件(和脚本)位于/usr/local/bin
,而不是/usr/lib
。如果不存在并且不在您的当前目录中,则$PATH
只需创建目录(mkdir -p /usr/local/bin
)并编辑设置的文件$PATH
(可能是 下的某个文件/etc
)。
请注意,只需稍加努力,您就可以将其包装在执行以下操作的脚本中:
#!/bin/ash
pgrep vpnc
if [ $? -eq 0 ]; then
ping -n -q -c 4 ip.at.other.side
if [ $? -ne 0 ]; then
/usr/local/bin/myscript
fi
fi
每隔一段时间从 cron 调用一次否分钟,当 VPN 运行时,如果 ping 另一端的 IP 失败,它将重新启动 VPN。
注意 - 我只是根据经验把它们拼凑起来,没有做过任何测试,也从未使用过灰烬。可能需要进行一些调整或返工。
好的,如果您没有 cron,您可以像这样包装第二个脚本:
#!/bin/ash
while [ true ]; do
pgrep vpnc
if [ $? -eq 0 ]; then
ping -n -q -c 4 ip.at.other.side
if [ $? -ne 0 ]; then
/usr/local/bin/myscript
fi
fi
sleep 60
done
要使其在后台运行,请使用nohup
:
nohup /usr/local/bin/mywrapper &
您应该会发现至少有一台服务器响应 ping,甚至可能是 VPN 端点。如果这不起作用,请尝试 DNS 服务器或路由器(人们很少锁定路由器)。
答案2
为了完整起见,我使用的实际脚本:
#! /bin/ash
pgrep vpnc >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
pkill vpnc
sleep 1
fi
vpnc /etc/vpnc/hybrid.conf
其中 hybrid.conf 是 vpnc 客户端的配置文件。我想了解有关脚本的更多信息,因此如果有人注意到此处的不良做法示例,请告诉我。