为 Ash 写脚本?

为 Ash 写脚本?

我的 VPN 有时会出现异常,我不得不经常重启它。我想编写一个脚本来帮我完成这项工作。它不需要花哨,只是我必须在终端中输入的命令的快捷方式。更具体地说:它将查看正在运行的进程。如果它发现正在运行的 vpnc 进程,它将终止它。然后它将启动 vpnc。

我写过类似复杂度的 bash 脚本,但现在我没有 bash,只有 ash。到目前为止,我注意到的唯一区别是可用的命令少了很多,但我并不经常使用它。所以我有一些问题。

  1. 编写 ash 脚本与编写 bash 脚本有何不同?
  2. 在做这件事时有什么特别需要考虑的吗?
  3. 脚本准备好后,我该如何部署它?对于 bash,我只需将可执行文件放在 /usr/lib 下,然后在命令行中输入文件名来运行它,这适用于 ash 吗?
  4. 在我要编写的脚本中,有什么需要注意的特殊陷阱吗?我认为,如果我编写了某些程序来终止错误的进程,终止进程部分可能会变得棘手,但即使这样,运行脚本也不会永久破坏任何东西,对吗?

答案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 客户端的配置文件。我想了解有关脚本的更多信息,因此如果有人注意到此处的不良做法示例,请告诉我。

相关内容