网络连接建立并运行后启动非 GUI 应用程序

网络连接建立并运行后启动非 GUI 应用程序

我使用的是 Raspbian,它基于 Debian。我的树莓派自动启动进入桌面。我有一个用 C 编写的小程序,并用 g++ 编译为可执行文件。该程序需要运行的网络连接并将一些数据输出到终端。没有什么花哨。

要使用它,我必须打开 LXterminal 窗口并使用 sudo 权限手动运行该程序

sudo ./Desktop/rpiMainProgram

我的问题是:建立网络连接后如何自动启动基于终端的程序?


我用拨号通过 来自动连接 3G 适配器/etc/network/interface。连接有效。我可以 ping 和冲浪

auto ppp0
iface ppp0 inet wvdial

我跟着本教程如果需要的话设置 wvdial

看到一个方法它使用post-up中的方法/etc/network/interfaces来调用 bash (?) 脚本。但我无法使用此方法来运行非 GUI 应用程序

我放弃之前的最后一次尝试是

auto ppp0
iface ppp0 inet wvdial
post-up LXterminal "sudo ./Desktop/rpiMainProgram"

答案1

您可以将类似的内容放入您的/etc/rc.local文件中(未经测试):

{ while ! ping -c 1 -W 1 8.8.8.8; do  sleep 1; done; /home/youruser/Desktop/rpiMainProgram > /home/youruser/Desktop/rpiMainProgram.log 2>&1; }&

ping -c 1 -W 1 8.8.8.8:发出一个 ping 数据包并等待 1 秒返回

while只要ping命令退出且状态码 >0(即失败),循环就会继续。

当您有网络连接并且可以8.8.8.8成功 ping 通时,循环将停止并执行您的程序(检查像这样调用它是否会产生影响,例如使用pwd)。

通过 ,{}我们将其变成一种单一的命令类型的东西,这样我们就可以使用 将整个东西推到后台&。否则它会阻止其余部分,/etc/rc.local直到您有网络为止。

可能有更优雅的解决方案,但我的 Pi 上有类似的解决方案。

答案2

在终端多路复用器中启动您的程序,例如屏幕或者多路复用器。使用它创建一个独立的终端,您可以在其中运行程序,并在您想要与其交互时连接到该终端。例如,对于 screen,在启动期间运行以下命令:

screen -S rpiMainProgram -d -m /home/nixda/Desktop/rpiMainProgram

并使用它附加到程序运行的屏幕实例:

screen -S rpiMainProgram -r -d

要与屏幕实例分离,请按Ctrl+ ,A然后按d

在 Debian 上,要在启用网络接口后运行程序,添加一个脚本在/etc/network/if-up.d。您需要检查正在启动哪个接口(特别是您不想在环回接口启动时启动程序)。创建/etc/network/if-up.d/local_rpiMainProgram包含类似内容的内容

#!/bin/sh
case "$IFACE" in
  ppp0) screen -S rpiMainProgram -d -m /home/nixda/Desktop/rpiMainProgram
esac

或者

#!/bin/sh
if ping -q -W1 -c1 8.8.8.8; then
  screen -S rpiMainProgram -d -m /home/nixda/Desktop/rpiMainProgram
fi

答案3

使用 rungetty 在未使用的虚拟终端上运行它会很好地工作。控制 alt fn查看输出。

相关内容