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的执行相分离,才最终解决了问题。
一句话,太阳底下无新鲜事,多尝试研究,问题都有解决方案。