Grep Wvdial 运行时的输出

Grep Wvdial 运行时的输出

我想要运行时grep的输出。实际上我想在连接调制解调器时触发一个任务。wvdialwvdial

我想通过以下方式执行此操作: grep字符串“IP 地址”,如果可用,则意味着调制解调器已连接,然后触发另一个 shell 脚本来执行另一个任务。

怎么可能呢?

答案1

严格来说,一个答案:

许多程序在通过管道传送到某个地方时,会缓冲它们的输出——它们一次写入多行。这会提高性能,但当然会破坏您对grep输出的尝试。 GNU Coreutils 包含一个实用程序stdbuf,通常可以让您更改此设置。您想要将 stdout 或 stderr 更改为行缓冲。这可能有效,但可能不是最好的解决方案。

更好的方法:

如果您查看/etc/ppp,您会看到那里有几个脚本,包括/etc/ppp/ip-up.当 PPP 链接出现时,pppd 运行该脚本。至少在 Debian 上,该脚本然后运行/etc/ppp/ip-up.d/​​.

因此,更简单的解决方案是将 shell 脚本放入/etc/ppp/ip-up.d/或编辑(如果不存在则创建)/etc/ppp/ip-up。类似地,还有…ipv6-up, 和…-down变体。还有一些;检查pppd联机帮助页的“脚本”部分了解详情。

请记住,您可以只使用 up 脚本来向您的脚本(或其他脚本)发出链接已准备就绪的信号 - 它本身不必执行该工作。例如,您可以使用简单的信号发出信号kill -USR1 other-script-pid,然后使用trap&sleep等待该信号。或者您可以打开一个命名管道(“fifo”,例如mkfifo)进行读取(它将阻塞,直到有写入器),然后使用 up 脚本echo alive > /path/to/fifo。或者回显 IP 地址或其他有用信息。或者您的脚本可以kill -STOP $$,然后您的 up 脚本也可以kill -CONT script-pid。有很多方法可以实现这一点。 (您甚至可以全力以赴使用 dbus。)

相关内容