Debian - 一旦有互联网连接可供使用,如何在启动时运行脚本?

Debian - 一旦有互联网连接可供使用,如何在启动时运行脚本?

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

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

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


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

答案1

将您的脚本放入/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.

答案2

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

将脚本作为 systemd 服务运行

如果您的系统正在运行系统,然后您可以将脚本配置为作为 systemd 服务运行,该服务提供对生命周期和执行环境的控制,以及启动脚本的前提条件,例如网络启动并运行、失败时重新启动等。

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

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

[Unit]
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
# By default type 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|exec|forking|oneshot|dbus|notify|idle
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

现在您可以测试该服务:

sudo systemctl start autossh

检查服务的状态:

systemctl status autossh

停止服务:

sudo systemctl stop autossh

一旦您确认该服务按预期工作,即可使用以下命令启用它:

sudo systemctl enable autossh

注意:出于安全目的,systemd将在受限环境中运行脚本,类似于crontab脚本的运行方式,因此不要对预先存在的系统变量(例如 $PATH 或 、 等中的任何变量)做出任何/.bashrc假设~/.zshrcEnvironment键(如果您的脚本需要定义特定变量)。set -x在 bash 脚本顶部添加然后运行systemctl status my_service可能有助于确定脚本失败的原因。作为一个规则,总是使用绝对路径对于所有内容,包括echo,或通过添加 来明确定义您的 $PATH Environment=MYVAR=abc

答案3

/etc/rc6.d/互联网连接可能是由 中的条目启动的S35networking。如果您更改该文件并在末尾插入命令,或者更好地添加一个/etc/init.d/mystuff并链接/etc/rc0.d/S36mystuff到该文件并在其中插入命令,那么一旦网络启动,该操作就会开始。

相关内容