ARM版ubuntu18.04实现程序延时随机启动

1,缘起

某个QT程序运行在ARM版ubuntu18.04操作系统中,随操作系统启动而自动启动。

具体方法是,在登录用户的.profile文件增加对程序的调用。相关指令如下:

sudo leafpad ~/.profile
添加以下内容:
export QTDIR=/usr/local/Trolltech/Qt-4.8.7
export PATH=$QTDIR/bin:$PATH
export MANPATH=$QTDIR/man:$MANPATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

vncserver &
cd  /home/teamhd/mypro_biaozhun
./mypro &

 

但实际运行后发现,系统的网络连接是否准备好,对程序的正常运行有影响。具体表现是,在同时满足以下条件时,

l  计算机设置网络地址为静态IP

l  在断网时,冷启动或热启动系统

随系统启动而自动启动的程序会出现如下界面,界面刷新方面有异常,如左上角的灰块。

 

猜测原因是断网启动时,静态IP联网处理需要较多的处理时间,在网络尚未准备好的情况下,程序启动时出现异常。

既然开机时网络准备需要较长的时间,那么将程序在以前的基础上延迟一段时间再运行,等网络准备好了再启动查询机程序。

以下讲述如何实现程序随机延时启动。

2,延时方案1

首先想到的是采用 /etc/rc.local来实现开机启动,替换.~/profile方式,但实验结果表明,前者运行的时间比后者还早,达不到延时执行的效果。

再想到crontab,但是crontab必须指定时间,无法与开机事件关联,也无法使用。

最后看到网上提到sleep可以延时,于是修改.profile文件,在执行程序前加了一句sleep 10s。

sleep 10s
cd  /home/teamhd/mypro_biaozhun
./mypro

结果发现,断网启动后,启动时间变长,屏幕变形,程序界面异常,似乎扩大为正常的2倍宽度,vnc弹出一个警告框,提示xstartup有错误。

如果把延时时间改为3s,界面宽度能恢复正常,但对于解决灰块问题没有帮助。

显然,本方案失败,没能解决原来的问题,还带来新的问题。那么原因在哪里呢?

3,延时方案2

分析认为,因为sleep语句是阻塞式执行,.profile中的延时可能打乱了操作系统的某些执行流程,某些涉及用户登录的初始化操作不能等待太久的时间,否则出错。

因此可以改进一下,将涉及程序运行的部分放到后台进程中延时执行,不要阻塞.profile的执行。具体步骤如下:

首先,编写脚本文件 run.sh,负责延时后启动程序:

sleep 10s
cd  /home/teamhd/mypro_biaozhun
./mypro

然后,修改.profile,采用后台执行方式调用 run.sh脚本:

export QTDIR=/usr/local/Trolltech/Qt-4.8.7
export PATH=$QTDIR/bin:$PATH
export MANPATH=$QTDIR/man:$MANPATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

vncserver &
/home/teamhd/run.sh &

 

上述方案实测成功,解决了最初的随机启动程序界面异常问题,同时不带来其它新的问题。

4,总结

Linux系统的程序开机运行是一个老话题,但是总会出现新问题。不同的Linux版本、不同的硬件架构,解决方案都不相同,不能张冠李戴。

笔者也曾经尝试过采用/etc/rc.local方案来实现开机启动,但该方案带来的不确定性比.profile更多,原因有2点,1是rc.local执行时间更早,2是执行时没有确定用户。

在研究sleep方案时,笔者也差点放弃,一开始将 sleep 2s写成了 sleep 2000,结果没产生任何效果;后来又在 .profile中尝试 在 sleep语句后加 “&”,结果当然是没有延时作用。

直到突然想到将程序的延时执行作为一个整体与 .profile的执行相分离,才最终解决了问题。

一句话,太阳底下无新鲜事,多尝试研究,问题都有解决方案。

posted @ 2021-10-22 09:19  jack0424  阅读(726)  评论(0编辑  收藏  举报