我使用的是 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查看输出。