我想要运行时grep
的输出。实际上我想在连接调制解调器时触发一个任务。wvdial
wvdial
我想通过以下方式执行此操作:
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。)