我正在运行一个依赖于网络启动和网络共享安装的脚本。该脚本在登录时运行(启动后自动发生)。问题是在脚本运行时,我通常还没有 IP 地址 (DHCP)。目前我只是让脚本休眠 15 秒,但我根本不喜欢这种方法,因为我希望能够告诉用户是否有问题。
我的计划是,当我还没有 IP 地址时循环并在我有时继续。至关重要的是,它必须在一段时间后超时。我想出的是,if [ ifconfig | grep "192.168.100" ];但结果是 grepconsumes];并且不喜欢它。然后 bash 也会感到不安,因为它找不到];哪个 grep 吃了。然后我什至还没有实现超时。
有人建议保留一个变量,并在每次迭代中休眠一秒,每次都增加这个变量。这是我的完整(非工作)脚本(我对 bash 脚本还很陌生):
x=0
while [ ifconfig | grep "192.168.100." > /dev/null ]; do
echo "no nework"
if "$x" -gt 200; then
#Time out here
exit 1
x=$((x+1))
sleep .1
fi
done
#continue with rest of script...
Run Code Online (Sandbox Code Playgroud)
任何指向正确方向的指针将不胜感激!
根据此问题及其答案,我已将以下内容添加到我的服务文件中:
Wants=network-online.target
After=docker.service network.target network-online.target
Run Code Online (Sandbox Code Playgroud)
我也跑了:
systemctl enable NetworkManager-wait-online.service
systemd-networkd-wait-online.service
Run Code Online (Sandbox Code Playgroud)
然而ExecStartPre,git pull origin master由于似乎是连接问题,我使用的任务仍然失败。
Mar 22 16:17:21 COMPUTER git[1983]: ssh: Could not resolve hostname github.com: Name or service not known
Mar 22 16:17:21 COMPUTER git[1983]: fatal: Could not read from remote repository.
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗?我是否需要等待其他服务才能使用git pull?(如果相关,我使用的是 Ubuntu 16.10 和 systemd 231。)
我在 ubuntu 18.04 服务器上。我需要运行一个更新 CloudFlare 上的 IP 地址的脚本(一种 DynDNS 脚本)。在以前的版本中,我可以使用接口 enp1s0 的 DHCLIENT 退出挂钩来执行此操作。
\n\n但是,systemd 现在使用自己的内置 DHCP 客户端。如何编写一个 systemd 单元,在向 DCHP 客户端提供新 IP 地址后立即执行 bash 脚本?
\n\nSystemd 正在管理接口 enp1s0:
\n\n#sudo systemctl status systemd-networkd\n\xe2\x97\x8f systemd-networkd.service - Network Service\n Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled-runtime; vendor preset: enabled)\n Active: active (running) since Tue 2018-09-18 01:54:16 +08; 10h ago\n Docs: man:systemd-networkd.service(8)\n Main PID: 878 (systemd-network)\n Status: "Processing requests..."\n Tasks: 1 (limit: 4915)\n CGroup: /system.slice/systemd-networkd.service\n \xe2\x94\x94\xe2\x94\x80878 /lib/systemd/systemd-networkd\n\nSep 18 01:54:27 xxx systemd-networkd[878]: enp1s0: Configured\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个脚本,在某些时候我需要列出目录中的所有内容并从该目录中 grep 一些内容。我用ls做不到。ls 不是我该做的人。所以我尝试用 echo 命令来完成 ls 的工作,但它现在给了我一个权限被拒绝的错误。您可以看到下面的脚本:
#!/bin/sh
# Test for network connection
for interface in $(echo $(/sys/class/net/*) | grep -v lo);
do
if [ "$(cat /sys/class/net/"$interface"/carrier)" = 1 ]; then
OnLine=1;
fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr;
exit;
fi
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
./carriercontrol.sh: line 10: /sys/class/net/apcli0: Permission denied
Run Code Online (Sandbox Code Playgroud)
我可以做什么来完成这个脚本?有没有办法获取目录列表并用某些东西通过管道传输它。而且即使我可以取消该许可,我认为 echo 也会给我带来更多麻烦。
编辑: 我尝试用 find 命令替换 echo ,这是结果和错误。
#!/bin/sh
# Test for network conection
for interface in $(find /sys/class/net -mindepth 1 | grep -v …Run Code Online (Sandbox Code Playgroud)