我正在运行 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
假设~/.zshrc
。Environment
键(如果您的脚本需要定义特定变量)。set -x
在 bash 脚本顶部添加然后运行systemctl status my_service
可能有助于确定脚本失败的原因。作为一个规则,总是使用绝对路径对于所有内容,包括echo
,或通过添加 来明确定义您的 $PATHEnvironment=MYVAR=abc
。
答案3
/etc/rc6.d/
互联网连接可能是由 中的条目启动的S35networking
。如果您更改该文件并在末尾插入命令,或者更好地添加一个/etc/init.d/mystuff
并链接/etc/rc0.d/S36mystuff
到该文件并在其中插入命令,那么一旦网络启动,该操作就会开始。