首页 > 系统相关 >Linux配置应用自启动,碰到一些问题

Linux配置应用自启动,碰到一些问题

时间:2023-02-18 16:33:06浏览次数:49  
标签:碰到 wayland stop etc init export Linux 自启动 start

最近在搞一个arm-linux,发现自动运行与手动运行,竟然效果是不一样,在解决问题的同时,也顺便把Linux启动相关一些知识梳理一遍。

 

  • 问题1:在/etc/init.d/ 新建一个S90startapp, 并且添加启动程序的路径。

此时,会发现该程序启动失败,并提示如下信息:

qt.qpa.plugin: Could not find the Qt platform plugin "eglfs" in ""
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: linuxfb, minimal, offscreen, vnc, wayland-egl, wayland.

大概的意思:程序是Qt的,不能 在wayland下运行程序

 

如果将启动链接放在S50launcher 里面,是可以正常启动的。

 

那么问题来了,如果添加自定义启动配置,要怎么配置。

 

先来看看,可以使用的S90startapp 配置 :

#
# Start app launcher...
#

case "$1" in
  start)
                printf "Starting Application launcher: "         

                export XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR:-/var/run}
                export QT_QPA_PLATFORM=${QT_QPA_PLATFORM:-wayland}  #关键是这句话,要添加环境变量
                            
                /userdata/tmp/AppServer &
                
        ;;
  stop)
                killall AppServer               
                printf "stop finished"
        ;;
  *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac
exit 0

 

 

时间解决的关键是要添加:

export QT_QPA_PLATFORM=${QT_QPA_PLATFORM:-wayland}

当然如果偷懒,这个环境变量放在 /etc/profile 里也是可以(这样就是全局行为)

 

奇怪的是,明明在S50launcher里面以及设置过该环境变量,这里为什么还要设置?

这个就是要关于 export这个命令,如果是该shell下执行的export 也就是仅仅该shell下生效,当切换或重新打开shell,那么export之后的内容都是无效的。

 

Linux,一般来说都是通过rcS来加载Sxx的启动脚本。因此,分析下rcS:

#!/bin/sh


# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set start
                . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i start   #这里,也就是说每加载一个Sxx文件,会调用该脚本的start,每次都是fork subprocess方式加载(重新开启进程)
            ;;
    esac
done

 

 

知道原理,其实就好解决了,疑惑也解开了。

梳理:

  1. 系统启动后,执行/etc/init.d/rcS
  2. rcS 加载 /etc/init.d/S?? 开头脚本。每次都是fork方式加载
  3. 因此如果临时修改环境变量,那么仅对本脚本生效
  4. 可以将环境变量放在 /etc/profile

 

  • 问题2:自动其他程序的时候,会出现如下warning:

sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.utf8)

大概意思,在shell下不能切换本地语言为zh_CN.utf8

 

实测:这句话,仅仅是warning,对功能并不影响(也不影响qt界面显示中文);

 

网上也搜索一堆,但都是要装个语言包之类的,显然不是arm-linux下解决办法。

 

竟然是应用程序引起这个warning,所以花了点时间,找下哪个fun产生的。通过不懈努力,后来发现

每当执行一边:popen,就会触发以上warn信息

 

FILE *pp = popen(cmd, "r");

 

翻阅了网上一些资料,发现popen是启动 sh -c 执行对应CMD的,也就是fork 出子进程方式进行,由于此时fork跟父进程一致,才导致该warning出现

 

解决办法:反正cmd也不会用到中文的,

索性就用:LC_ALL=C 就可以了。也就是说在S50launcher 里export LC_ALL=C就可以

 

扩展S50launcher知识:

#
# Start linux launcher...
#

# Load default env variables from profiles(e.g. /etc/profile.d/weston.sh)
. /etc/profile    #将profile里设置

case "$1" in
  start)
                printf "Starting launcher: "
                export LC_ALL=C    #设置语言,也就是本shell生效
                #export LC_ALL='zh_CN.utf8'  #原先设置

                # Uncomment to disable mirror mode
                # unset WESTON_DRM_MIRROR

                export XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR:-/var/run}
                export QT_QPA_PLATFORM=${QT_QPA_PLATFORM:-wayland}  #设置qt运行在wayland
                echo 3 > /sys/class/graphics/fb0/blank

                weston --tty=2 --idle-time=0&
                {
                        # Wait for weston ready
                        while [ ! -e ${XDG_RUNTIME_DIR}/wayland-0 ]; do
                                sleep .1   #等待wayland启动成功
                        done
                        #/usr/bin/QLauncher &     #原先桌面程序,可以屏蔽掉                    
                        #/userdata/tmp/AppServer &  #添加自己的启动程序
                        echo 0 > /sys/class/graphics/fb0/blank   
                }&
        ;;
  stop)
                killall AppServer   #当系统重启或退出的时候,调用stop
                killall weston
                printf "stop finished"
        ;;
  *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac
exit 0

 

 

 

梳理:

当系统启动时候,调用 /etc/init.d/rcS 然后调用各个Sxx 的脚本 "start)"

当系统推出时候,调用 /etc/init.d/rcK 然后调用各个Sxx脚本的 "stop)"

 

标签:碰到,wayland,stop,etc,init,export,Linux,自启动,start
From: https://www.cnblogs.com/winafa/p/17132950.html

相关文章

  • linux基本功系列之fdisk命令实战
    前言大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第49篇文章。......
  • linux015之软件包的管理
    linux中软件安装包的管理:RPM:简介:RPM是linux中一种软件安装工具,安装linux之初就已经安装好了的,直接使用它的命令即可。这个工具相当于手动安装软件,需要自行......
  • 嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板
    本篇测评由电子发烧友的优秀测评者“ALSET”提供。 米尔MYD-Y6ULX-V2开发板,基于NXPi.MX6UL/i.MX6ULL处理器,该开发板被米尔称之为经典王牌产品。本次测试目标是在此......
  • vscode 远程连接 linux 远程开发
    1.安装拓展remote-ssh2.设置云主机git控制台使用命令ssh-keygen#生成一个sshkey#登录远程主机#sshubuntu@123.123.123.123#adduserwhmmm#addgro......
  • Linux系列教程(十三)——Linux软件包管理之源码包、脚本安装包
    上篇博客我们讲解了网络yum源和光盘yum源的搭建步骤,然后详细介绍了相关的yum命令,yum最重要是解决了软件包依赖性问题。在安装软件时,我们使用yum命令将会简单方便很多。......
  • linux014之进程和服务管理
    linux中的进程管理:查看进程命令:ps:查看应用级别的进程ps-e:查看系统+应用级的进程ps-ef:显示进程的全部信息(这个命令经常用)ps......
  • 修改linux下jdk环境变量
    1、查看jdk版本:2、查看jdk安装路径:echo$JAVA_HOME    3、用vim/etc/profile进入编辑状态,以下配置需要修改:(配置的jdk的路径一定得对) 修改:JAVA_HOME=/usr......
  • linux中yum命令
    修改nginx的配置文件Nginx卸载1:停止Nginx软件systemctlnginxstop2:删除Nginx的自动启动chkconfignginxoff3:从源头删除Nginxrm-rf/usr/sbin/nginxrm-rf/et......
  • Linux系统之使用autofs自动挂载nfs共享
    (Linux系统之使用autofs自动挂载nfs共享)一、autofs介绍Autofs是一项可自动挂载相应文件系统的客户端服务,可用于nfs共享的自动挂载,无需手动mount挂载,方便日常使用。二......
  • Linux环境下常见软件安装
    一、克隆虚拟机1、准备一台你要克隆的虚拟机,保证时关闭状态。2、在vmware中选中你的虚拟机,右键,选择“管理”,在选择克隆3、在克隆源中,可以选择“当前状态”,如果有快照,可......