Debian - 如何在互联网连接准备好后立即在启动时运行脚本?

Min*_*ock 15 startup networking debian

我正在运行 Debian 7 Wheezy,只要有功能齐全的互联网连接,我就需要在启动时启动一些屏幕。但是,如果互联网连接中断并再次连接,则不会。所以只有在启动后的第一个功能性互联网连接上。

您能否为此发布一个虚拟脚本并告诉我将它放在哪里并使其在给定条件下执行?

脚本只需要启动屏幕然后终止,但屏幕应该继续。


编辑 我已经听说过这个/etc/network/if-up.d/文件夹。但是,如果互联网连接丢失然后重新建立,我如何确保脚本不会再次执行?

Cel*_*ada 21

将您的脚本放入/etc/network/if-up.d并使其可执行。每次出现网络接口时,它都会自动运行。

为了让它只在每次启动时第一次运行时才起作用,让它检查你在第一次之后创建的标志文件是否存在。例子:

#!/bin/sh

FLAGFILE=/var/run/work-was-already-done

case "$IFACE" in
    lo)
        # The loopback interface does not count.
        # only run when some other interface comes up
        exit 0
        ;;
    *)
        ;;
esac

if [ -e $FLAGFILE ]; then
    exit 0
else
    touch $FLAGFILE
fi

: here, do the real work.
Run Code Online (Sandbox Code Playgroud)

  • @MinecraftShamrock 如果您按原样使用 Celada 的脚本,则只要回送接口出现,您的代码就会运行。如果你想等待互联网连接,至少检查“IFACE”不是“lo”——或一些虚拟接口——或者更好,通过 ping 测试互联网连接。 (3认同)

ccp*_*zza 10

这是一份非常适合的工作systemd

将脚本作为 systemd 服务运行

如果您的系统正在运行systemd,那么您可以将脚本配置为作为 systemd 服务运行,该服务提供对生命周期和执行环境的控制,以及启动脚本的先决条件,例如网络启动和运行。

为您自己的服务推荐的文件夹是/etc/systemd/system/(另一个选项是,/lib/systemd/system但通常应仅用于 OOTB 服务)。

创建文件,例如sudo vim /etc/systemd/system/autossh.service

[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

现在您可以测试该服务:

sudo systemctl start autossh
Run Code Online (Sandbox Code Playgroud)

检查服务状态:

systemctl status autossh
Run Code Online (Sandbox Code Playgroud)

停止服务:

sudo systemctl stop autossh
Run Code Online (Sandbox Code Playgroud)

一旦您确认该服务按预期运行,请使用以下命令启用它:

sudo systemctl enable autossh
Run Code Online (Sandbox Code Playgroud)

注:为了安全起见systemd会在受限制的环境中运行该脚本,类似于如何crontab脚本运行,因此不要对已存在的系统变量的任何假设,如$ PATH或者你在你拥有了/.bashrc~/.zshrc等使用Environment键,如果您的脚本需要定义特定的变量。set -x在 bash 脚本的顶部添加然后运行systemctl status my_service可能有助于确定脚本失败的原因。作为 tumb 的规则,始终对包括 在内的所有内容使用绝对路径echo,或者通过添加Environment=MYVAR=abc.