断开连接后重新启动网络管理器?

使用Ubuntu 11.10(Unity 3D)和有线(DSL)互联网连接,没有路由器或调制解调器。

如果断开了我的互联网连接,我可以通过单击网络管理器图标并从下拉菜单中选择一个连接来重新连接,因为我的连接是可见的。 无需重新启动网络管理器。

但是每当互联网连接自身下降时,我就打开终端并使用sudo service network-manager restart因为我在网络管理器下拉菜单中没有看到任何连接。 只有在命令之后,网络管理器才会启动并自动连接。

是否有一些设置,以便每次连接断开时都不必重新启动网络管理器(而不是在不需要重启时断开连接)?

换句话说,我想,只要我使用计算机,我就不希望网络管理员停止,无论我与ISP的连接是否已经丢失。

打开终端并输入命令和密码并不是什么大不了的事,但是如果有办法确保网络管理员不停止会更好。

编辑日期为2012年1月26日:来自syslog的行

 Jan 25 20:09:36 aes-Inspiron-1545 pppd[3539]: No response to 3 echo-requests Jan 25 20:09:36 aes-Inspiron-1545 pppd[3539]: Serial link appears to be disconnected. Jan 25 20:09:36 aes-Inspiron-1545 pppd[3539]: Connect time 241.5 minutes. Jan 25 20:09:36 aes-Inspiron-1545 pppd[3539]: Sent 3575961 bytes, received 79026206 bytes. Jan 25 20:09:36 aes-Inspiron-1545 pppd[3539]: Connection terminated. Jan 25 20:09:36 aes-Inspiron-1545 avahi-daemon[836]: Withdrawing workstation service for ppp0. Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  (eth0): device state change: activated -> failed (reason 'ppp-disconnect') [100 120 13] Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  Activation (eth0) failed. Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]: SCPlugin-Ifupdown: devices removed (path: /sys/devices/virtual/net/ppp0, iface: ppp0) Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  (eth0): now unmanaged Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  (eth0): device state change: failed -> unmanaged (reason 'removed') [120 10 36] Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  (eth0): deactivating device (reason 'removed') [36] Jan 25 20:09:36 aes-Inspiron-1545 dbus[802]: [system] Activating service name='org.freedesktop.nm_dispatcher' (using servicehelper) Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  could not read ppp stats: No such device Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  (eth0): cleaning up... Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  (eth0): taking down device. Jan 25 20:09:36 aes-Inspiron-1545 kernel: [18027.155552] sky2 0000:09:00.0: eth0: disabling interface Jan 25 20:09:36 aes-Inspiron-1545 avahi-daemon[836]: Interface eth0.IPv6 no longer relevant for mDNS. Jan 25 20:09:36 aes-Inspiron-1545 avahi-daemon[836]: Leaving mDNS multicast group on interface eth0.IPv6 with address fec0::b:223:aeff:fe2d:2431. Jan 25 20:09:36 aes-Inspiron-1545 avahi-daemon[836]: Withdrawing address record for 2002:1b00:3b4f:b:223:aeff:fe2d:2431 on eth0. Jan 25 20:09:36 aes-Inspiron-1545 avahi-daemon[836]: Withdrawing address record for 2002:1b00:3754:b:223:aeff:fe2d:2431 on eth0. Jan 25 20:09:36 aes-Inspiron-1545 avahi-daemon[836]: Withdrawing address record for 2002:7345:f137:b:223:aeff:fe2d:2431 on eth0. Jan 25 20:09:36 aes-Inspiron-1545 avahi-daemon[836]: Withdrawing address record for fec0::b:223:aeff:fe2d:2431 on eth0. Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  Unmanaged Device found; state CONNECTED forced. (see http://bugs.launchpad.net/bugs/191889) Jan 25 20:09:36 aes-Inspiron-1545 NetworkManager[3531]:  Unmanaged Device found; state CONNECTED forced. (see http://bugs.launchpad.net/bugs/191889) Jan 25 20:09:36 aes-Inspiron-1545 pppd[3539]: Terminating on signal 15 Jan 25 20:09:36 aes-Inspiron-1545 pppd[3539]: Exit. Jan 25 20:09:36 aes-Inspiron-1545 dbus[802]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher' Jan 25 20:11:56 aes-Inspiron-1545 modem-manager[3529]:  Caught signal 15, shutting down... Jan 25 20:11:56 aes-Inspiron-1545 NetworkManager[3531]:  caught signal 15, shutting down normally. Jan 25 20:11:56 aes-Inspiron-1545 NetworkManager[3531]:  quit request received, terminating... Jan 25 20:11:56 aes-Inspiron-1545 NetworkManager[3531]:  (eth1): now unmanaged Jan 25 20:11:56 aes-Inspiron-1545 NetworkManager[3531]:  (eth1): device state change: unavailable -> unmanaged (reason 'removed') [20 10 36] Jan 25 20:11:56 aes-Inspiron-1545 NetworkManager[3531]:  Unmanaged Device found; state CONNECTED forced. (see http://bugs.launchpad.net/bugs/191889) Jan 25 20:11:56 aes-Inspiron-1545 NetworkManager[3531]:  exiting (success) Jan 25 20:11:56 aes-Inspiron-1545 modem-manager[6945]:  ModemManager (version 0.5) starting... Jan 25 20:11:56 aes-Inspiron-1545 NetworkManager[6947]:  NetworkManager (version 0.9.1.90) is starting... Jan 25 20:11:56 aes-Inspiron-1545 NetworkManager[6947]:  Read config file /etc/NetworkManager/NetworkManager.conf Jan 25 20:11:56 aes-Inspiron-1545 kernel: [18167.470749] init: reconnect main process (6948) terminated with status 2 Jan 25 20:11:56 aes-Inspiron-1545 modem-manager[6945]:  Loaded plugin Nokia Jan 25 20:11:56 aes-Inspiron-1545 modem-manager[6945]:  Loaded plugin Ericsson MBM Jan 25 20:11:56 aes-Inspiron-1545 modem-manager[6945]:  Loaded plugin MotoC 

在此处输入图像描述

这是一个可以放到/etc/init/reconnect.conf的Upstart脚本:

 start on started network-manager stop on runlevel [016] script while true; do if ifconfig eth0 | grep -q "inet addr:"; then # echo "all ok!" else restart network-manager fi sleep 5 done end script 

丢失eth0的ip地址(如果不同,则配置为您的接口),它将重新启动网络管理器作业并恢复连接。

一个快速而肮脏的解决方法是编写一个运行ping -i 5 google.com || service network-manager restart的脚本 ping -i 5 google.com || service network-manager restart以root身份ping -i 5 google.com || service network-manager restart (您可以为此编写/etc/init.d/-daemon,但由于解决方案非常脏,我不会这样做)

每次找到Google时,该脚本都会重新启动网络管理员,并且每五秒检查一次。

尝试wicd而不是网络管理器,它被推荐用于类似的案例: https ://bbs.archlinux.org/viewtopic.php?id = 124443

我不知道它是否能解决这个问题,也不知道wicd是否支持pppoe。

  1. 备份.deb文件,以防万一:

     sudo apt-get download network-manager network-manager-gnome 
  2. 清除网络管理器并安装wicd

     sudo apt-get purge network-manager network-manager-gnome sudo apt-get install wicd wicd-gtk 
  3. 重启。 尝试使用wicd进行连接。

如果出现任何问题,只需清除wicd并重新安装网络管理器:

 sudo apt-get purge wicd wicd-gtk sudo dpkg -i network-manager*.deb 

我为这个问题制作了一个脚本:

 #!/bin/bash for(( ; ; )) do VALUE=$(ifconfig | grep ppp0| awk '{print $1}') if [ "$VALUE" != "ppp0" ]; then { eval restart network-manager eval sleep 5 } fi done 

这工作正常,但这个脚本占用了我太多的CPU。 任何人都可以帮助我降低CPU使用率吗?

为什么我要回答这个问题?

Ther是非常好的答案,但都是使用init或upstart编写的。 从现在开始我们将使用systemd,我正在编写更好的脚本和信息。 如何做到这一点。

但有办法吗?

是的,有办法。 您只需创建一个监视网络状态的脚本,并根据需要重新启动Network Manager。 我们将构建此脚本和系统服务,该服务将从系统启动,并将每隔5秒监视您的网络状态,以查找您是否在线。

我该怎么办?

首先,我们需要安装fping工具进行连接测试之一(如果可以连接则fping返回“is alive”,否则返回“address not found”):

 $ sudo apt-get install fping -y 

现在我们将在我们的系统上创建监控脚本。 在/ usr / local / bin /创建一个名为nm-watcher的文件:

 $ sudo touch /usr/local/bin/nm-watcher 

并使用nano或您喜欢的文本编辑器编辑它:

 $ sudo nano /usr/local/bin/nm-watcher 

将此脚本复制并粘贴到编辑器中,保存并关闭文件(如果您使用的是nano,就像在本教程中一样,按顺序使用“CTRL + X”“Y”和“ENTER”)。 不要忘记将wlan0更改为您希望wm-watcher监视的接口:

 #!/bin/bash while true; do #create a infinite loop to keep looking at your connection NET=$(ifconfig wlan0 | grep "inet inet addr:") # verify if the interface has an assigned IP ROUTE=$(fping google.com 2>&1 | grep "alive") # try to ping google.com and verify if we have any response WEB=$(wget --tries=10 --timeout=20 --spider http://google.com 2>&1 | grep "OK") # spiders google.com to verify if the page exists. returns error if a connections is not possible if [ ! "$NET" != "" ] || [ ! "$ROUTE" != "" ] || [ ! "$WEB" != "" ]; then # verify if any of the above conditions aren't OK service network-manager restart fi sleep 5 done 

要运行此脚本,我们需要使其可执行:

 $ sudo chmod 755 /usr/local/bin/nm-watcher 

现在,我们将创建SystemD服务,为此,您应该在/ etc / systemd / system /创建和编辑nm-watcher.service文件:

 $ sudo touch /etc/systemd/system/nm-watcher.service && sudo nano /etc/systemd/system/nm-watcher.service 

并将此内容放在文件中:

 [Unit] Description=NetworkManager Watcher Wants=NetworkManager.service Before=NetworkManager.service [Service] ExecStart=/usr/local/bin/nm-watcher [Install] WantedBy=multi-user.target 

在我们使用network-manager.service建立连接之后,这将创建服务文件,使SystemD调用我们在每次启动之前创建的脚本。

我们应该知道使用以下命令启用此服务:

 $ sudo systemctl enable nm-watcher.service 

然后输入以下命令启动服务:

 $ sudo service nm-watcher start 

要validation服务是否正在运行,请键入:

 $ sudo service nm-watcher status 

如果您对服务有任何问题,可以使用以下命令查看调试消息:

 $ sudo journalctl -u nm-watcher 

我应该做其他事吗?

不,这就是完成此任务所需的全部内容。 此脚本对系统性能的影响非常小,您可以在此屏幕截图中看到:

nm-watcher足迹

在我的旧笔记本电脑上,我有一个坏的WiFi卡,如果有很多负载(例如,下载大文件等),它往往会与WiFi断开连接。

我创建了一个简单的脚本来检查我的互联网是否仍然连接,如果没有,则重新启动网络管理器。

 #!/bin/bash ping -c 1 8.8.8.8 received=$? echo $received if [[ $received -ne 0 ]] ; then service network-manager restart fi 

我用sudo crontab -e创建了一个root cronjob,并将其设置为每分钟(你可以更频繁地执行它,但脚本是一个简单的ping,所以它不是资源密集的)它会运行脚本。

所以,如果我的WiFi由于某种原因确实出了问题,那么它一次只会出现大约一分钟,顶部。 如果您对cron不熟悉,我建议您阅读此内容