AM335x添加QT开机自启动

    本文使用的文件系统是Ti的ti-processor-sdk-linux-am335x-evm-06.03.00.106。首先开发板的文件使用的是systemd 并没有/etc/rc.local文件 所以要想修改rc.local这一简单的操作已经不存在 但是也是可以用systemd和initd两种方式解决这个问题

   

Systemd

Systemd 是系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。
systemd被设计用来改进sysvinit的缺点,它和ubuntu的upstart是竞争对手,预计会取代它们。systemd的很多概念来源于苹果的launchd。创始人Lennart是redhat员工,但systemd不是redhat项目。

systemd的目标是:尽可能启动更少进程;尽可能将更多进程并行启动。systemd尽可能减少对shell脚本的依赖。传统sysvinit使用inittab来决定运行哪些shell脚本,大量使用shell脚本被认为是效率低下无法并行的原因。systemd使用了Linux专属技术,不再顾及POSIX兼容,一度谣传Debian为了它的BSD项目将不会使用systemd。

特性:
系统引导时实现服务并行启动,实现快速开机。
按需启动守护进程。
能自动保存系统状态快照。
基于依赖关系定义服务控制逻辑(自动化的服务依赖关系管理)。
同时采用 socket 式与 D-Bus 总线式激活服务。

    system是以服务的形式,自己写一个服务,和一个开机脚本。启动服务调取自己写的脚本,后执行systemctl enable  xx.service启动服务即可。相关命令如下


# 立即启动一个服务
$ sudo systemctl start apache.service

# 立即停止一个服务
$ sudo systemctl stop apache.service

# 重启一个服务
$ sudo systemctl restart apache.service

# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service

# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service

# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload

# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service

# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500

步骤:

1设置开机脚本

  在 /etc/init.d/目录下添加自己的脚本
 

#vi  /etc/init.d/CCCstartup.sh
#! /bin/sh

# Important System Environment Variables
for sh in /etc/profile.d/*.sh ; do
    [ -r "$sh" ] && . "$sh"
done

/usr/bin/videowidget -platform linuxfb &

2.创建启动服务

/etc/systemd/system下新建服务
 

root@am335x-evm:~# cat /etc/systemd/system/qtstart.service 
[Unit]
Description=qtstart
#After=weston.service
#Requires=weston.service
After=thttpd.service
Before=graphical.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/init.d/CCCstartup.sh

[Install]
WantedBy=multi-user.target

3.启动服务

systemctl daemon-reload
systemctl enable qtstart.service

执行完enable后,会在/etc/systemd/system/multi-user.target.wants/ 目录中创建个启动脚本的链接。

4.禁止原系统开机自启

systemctl disable weston.service
systemctl disable matrix-gui-2.0.service
systemctl daemon-reload
#手动关闭:关闭登陆界面在屏上显示
systemctl stop getty@tty1.service

#永久关闭:关闭登陆界面在屏上显示
systemctl disable getty@tty1.service

另一个兼容rc-local的方法

1.systemd
我这里是修改自带的

service root@am335x-evm:/etc/rc5.d# ls /lib/systemd/system/rc-local.service /lib/systemd/system/rc-local.service

在开发板这个目录我找到了rc-local.service文件 查看其内容

root@am335x-evm:/etc/rc5.d# cat /lib/systemd/system/rc-local.service

# This file is part of systemd. #

# systemd is free software; you can redistribute it and/or modify it

# under the terms of the GNU Lesser General Public License as published by

# the Free Software Foundation; either version 2.1 of the License, or

# (at your option) any later version. # This unit gets pulled automatically into multi-user.target by

# systemd-rc-local-generator if /etc/rc.local is executable.

[Unit] Description=/etc/rc.local

Compatibility ConditionFileIsExecutable=/etc/rc.local

After=network.target [Service] Type=forking

ExecStart=/etc/rc.local start TimeoutSec=0 RemainAfterExit=yes

可见开发板是支持/etc/rc.local文件的使用的 但是开发板下又没有/etc/rc.local文件 所以我们只能自己去建立了
在/lib/systemd/system/rc-local.service下加多一段文字

[Install] WantedBy=multi-user.target multi-user.target指明的是非图形界面的多用户方式 然后就去创建rc.local文件 vi /etc/rc.cal 然后加入以下代码

#!/bin/sh

case "$1" in start) /file_creat Tronlong ;; stop) exit 0;; esac

然后就输入以下命令

# chmod +x /etc/rc.local

# systemctl enable rc-local.service

# systemctl --system daemon-reload

# systemctl start rc-local.service 然后重启后就可以看到Tronlong这个文件了

2.initd
首先创建/etc/init.d/helloworld文件
vi /etc/init.d/helloworld
内容为 #!/bin/sh xxxxxxxx //你要启动的程序命令 # chmod +x /etc/init.d/helloworld //加可执行权限 # ln -sf /etc/init.d/helloworld /etc/rc5.d/S99helloworld //建立链接 # update-rc.d helloworld start 99 2 . //设置成开机启动项 然后重启就能看到程序运行了

扩展了解:

Systemd 添加自定义服务(开机自启动)

Systemd 添加自定义服务(开机自启动)_zhangatong的博客-CSDN博客_systemd 自启动

Systemd配置开机自启动,执行shell脚本_RyanJJ_的博客-CSDN博客_systemd 执行shell脚本

Systemd 入门教程:命令篇

Systemd 入门教程:命令篇 - 阮一峰的网络日志

Systemd 简介:Systemd/zh-cn - Fedora Project Wiki

Systemd 入门教程:命令篇:
Systemd 入门教程:命令篇 - 阮一峰的网络日志

使用systemd挂载文件系统:
CSDN

官方手册:
 systemd.service

中文翻译:
systemd.service 中文手册 [金步国]

系统启动过程
CentOS 7 的启动过程是这样的:

 
  1. 顺序     说明

  2. post     加电

  3. BISO     进入BIOS

  4. bootloader(MBR)    加载磁盘主引导记录

  5. kernel(ramdisk)    加载内核

  6. rootfs     初始化rootfs

  7. /sbin/init     系统初始化。Sysv lnit,Upstart 或 systemd 系统守护进程。

 
  1. UEFi或BIOS初始化,运行POST开机自检

  2. 选择启动设备

  3. 引导装载程序, centos7是grub2

  4. 加载装载程序的配置文件: /etc/grub.d/

  5. /etc/default/grub /boot/grub2/grub.cfg

  6. 加载initramfs驱动模块

  7. 加载内核选项

  8. 内核初始化, centos7使用systemd代替init

  9. 执行initrd.target所有单元,包括挂载/etc/fstab

  10. 从initramfs根文件系统切换到磁盘根目录

  11. systemd执行默认target配置,配置文件

  12. /etc/systemd/default.target /etc/systemd/system/

  13. systemd执行sysinit.target初始化系统及basic.target准备操

  14. 作系统

  15. systemd启动multi-user.target下的本机与服务器服务

  16. systemd执行multi-user.target下的/etc/rc.d/rc.local

  17. Systemd执行multi-user.target下的getty.target及登入服

  18. systemd执行graphical需要的服务

Systemd

Systemd 是系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。
systemd被设计用来改进sysvinit的缺点,它和ubuntu的upstart是竞争对手,预计会取代它们。systemd的很多概念来源于苹果的launchd。创始人Lennart是redhat员工,但systemd不是redhat项目。

systemd的目标是:尽可能启动更少进程;尽可能将更多进程并行启动。systemd尽可能减少对shell脚本的依赖。传统sysvinit使用inittab来决定运行哪些shell脚本,大量使用shell脚本被认为是效率低下无法并行的原因。systemd使用了Linux专属技术,不再顾及POSIX兼容,一度谣传Debian为了它的BSD项目将不会使用systemd。

特性:
系统引导时实现服务并行启动,实现快速开机。
按需启动守护进程。
能自动保存系统状态快照。
基于依赖关系定义服务控制逻辑(自动化的服务依赖关系管理)。
同时采用 socket 式与 D-Bus 总线式激活服务。

核心概念 unit(单元):
CSDN

一、service unit 常用命令,以 mysql 服务为例

 
  1. # 开机启动

  2. systemctl enable mysqld

  3. # 关闭开机启动

  4. systemctl disable mysqld

  5. # 启动服务

  6. systemctl start mysqld

  7. # 停止服务

  8. systemctl stop mysqld

  9. # 重启服务

  10. systemctl restart mysqld

  11. # 查看服务状态

  12. systemctl status mysqld

  13. systemctl is-active sshd.service

  14. # 结束服务进程(服务无法停止时)

  15. systemctl kill mysqld

二、服务启动的配置文件

配置文件主要放在 /usr/lib/systemd/system 目录,也可能在 /etc/systemd/system  /lib/systemd/system目录

 
  1. # 查看 sshd 服务启动文件

  2. systemctl cat sshd.service

  3. # /usr/lib/systemd/system/sshd.service

  4. [Unit]

  5. Description=OpenSSH server daemon

  6. Documentation=man:sshd(8) man:sshd_config(5)

  7. After=network.target sshd-keygen.service

  8. Wants=sshd-keygen.service

  9. [Service]

  10. Type=notify

  11. EnvironmentFile=/etc/sysconfig/sshd

  12. ExecStart=/usr/sbin/sshd -D $OPTIONS

  13. ExecReload=/bin/kill -HUP $MAINPID

  14. KillMode=process

  15. Restart=on-failure

  16. RestartSec=42s

  17. [Install]

  18. WantedBy=multi-user.target

每个服务文件以 .service 结尾,一般会分为 3 部分,必须包含 [Service] 部分

[Unit] 启动顺序与依赖关系

 
  1. Description:当前服务的简单描述

  2. Documentation:指定 man 文档位置

  3. After:如果 network.target 或 sshd-keygen.service 需要启动,那么 sshd.service 应该在它们之后启动

  4. Before:定义 sshd 应该在哪些服务之前启动

  5. 注意:After 和 Before 字段只涉及启动顺序,不涉及依赖关系。

  6. Wants:表示 sshd.service 与 sshd-keygen.service 之间存在"弱依赖"关系,即如果"sshd-keygen.service"启动失败或停止运行,不影响 sshd.service 继续执行

  7. Requires:表示"强依赖"关系,即如果该服务启动失败或异常退出,那么sshd.service 也必须退出

  8. 注意:Wants 字段与 Requires 字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动。

[Service] 启动行为

 
  1. EnvironmentFile:许多软件都有自己的环境参数文件,该字段指定文件路径

  2. 注意:/etc/profile 或者 /etc/profile.d/ 这些文件中配置的环境变量仅对通过 pam 登录的用户生效,而 systemd 是不读这些配置的。

  3. systemd 是所有进程的父进程或祖先进程,它的环境变量会被所有的子进程所继承,如果需要给 systemd 配置默认参数可以在 /etc/systemd/system.conf 和 /etc/systemd/user.conf 中设置。

  4. 加载优先级 system.conf 最低,可能会被其他的覆盖。

  5. Type:定义启动类型。可设置:simple,exec,forking,oneshot,dbus,notify,idle

  6. simple(设置了 ExecStart= 但未设置 BusName= 时的默认值):ExecStart 字段启动的进程为该服务的主进程

  7. forking:ExecStart 字段的命令将以 fork() 方式启动,此时父进程将会退出,子进程将成为主进程

  8. ExecStart:定义启动进程时执行的命令

  9. 上面的例子中,启动 sshd 执行的命令是 /usr/sbin/sshd -D $OPTIONS,其中的变量 $OPTIONS 就来自 EnvironmentFile 字段指定的环境参数文件。类似的,还有如下字段:

  10. ExecReload:重启服务时执行的命令

  11. ExecStop:停止服务时执行的命令

  12. ExecStartPre:启动服务之前执行的命令

  13. ExecStartPost:启动服务之后执行的命令

  14. ExecStopPost:停止服务之后执行的命令

  15. RemainAfterExit:设为yes,表示进程退出以后,服务仍然保持执行

  16. KillMode:定义 Systemd 如何停止服务,可以设置的值如下:

  17. control-group(默认值):当前控制组里面的所有子进程,都会被杀掉

  18. process:只杀主进程

  19. mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号

  20. none:没有进程会被杀掉,只是执行服务的 stop 命令

  21. Restart:定义了退出后,Systemd 的重启方式。可以设置的值如下:

  22. no(默认值):退出后不会重启

  23. on-success:只有正常退出时(退出状态码为0),才会重启

  24. on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启

  25. on-abnormal:只有被信号终止和超时,才会重启

  26. on-abort:只有在收到没有捕捉到的信号终止时,才会重启

  27. on-watchdog:超时退出,才会重启

  28. always:不管是什么退出原因,总是重启

  29. RestartSec:表示 Systemd 重启服务之前,需要等待的秒数

配置中多个相同配置会选择最后一个,下面结果是 execstart2

[Service]

ExecStart=/bin/echo execstart1

ExecStart=/bin/echo execstart2

所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行

EnvironmentFile=-/etc/sysconfig/sshd,表示即使 /etc/sysconfig/sshd 文件不存在,也不会抛出错误

[Install]

WantedBy:表示该服务所在的 Target(服务组)

关于 Target,运行级别

 
  1. # 查看默认 Target

  2. systemctl get-default

  3. # 结果为 multi-user.target,表示默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么 systemctl enable 命令能设置开机启动的原因

  4. # 查看 multi-user.target 包含的所有服务

  5. systemctl list-dependencies multi-user.target

  6. # 切换到另一个 target

  7. # shutdown.target 就是关机状态

  8. # 常用的 Target 有两个:一个是 multi-user.target,表示多用户命令行状态;另一个是 graphical.target,表示图形用户状态,它依赖于 multi-user.target

  9. systemctl isolate shutdown.target

三、自定义服务

在 /usr/lib/systemd/system 下新建服务脚本

 
  1. vim /usr/lib/systemd/system/zdy.service

  2. [Unit]

  3. Description=描述

  4. Environment=环境变量或参数(系统环境变量此时无法使用)

  5. After=network.target

  6. [Service]

  7. Type=forking

  8. EnvironmentFile=所需环境变量文件或参数文件

  9. ExecStart=启动命令(需指定全路径)

  10. ExecStop=停止命令(需指定全路径)

  11. User=以什么用户执行命令

  12. [Install]

  13. WantedBy=multi-user.target

新建完成后设置自启动

 
  1. # 添加或修改配置文件后,需要重新加载

  2. systemctl daemon-reload

  3. # 设置自启动,实质就是在 /etc/systemd/system/multi-user.target.wants/ 添加服务文件的链接

  4. systemctl enable zdy

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值