板端的发布程序自启动:

1、可以选择将应用程序和依赖打包到rootfs中,或者放到单独的eMMC分区中

2、自启动,在rootfs的 /etc/init.d/rcS 或者/etc/inittab

3、配置systemctl 自启动

3.1 自启动脚本路径

/lib/systemd/system/

3.2 撰写脚本service

 

[Unit]
Description=mongodb程序
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/opt/mongodb-3.4.0/start.sh
ExecStop=/opt/mongodb-3.4.0/stop.sh
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

自己写个例子

autopilot.sh

#!/bin/bash
sleep 10
sudo ip link set enp2s0 up
sudo ifconfig enp2s0 10.7.77.1 netmask 255.255.0.0

autopilot.service

[Unit]
Description=calmcar autopilot service
DefaultDependencies=no
Requires= network.target 
After=rc-local.service
[Service]

Type=oneshot
RemainAfterExit=yes
ExecStart=/home/nvidia/autopilot.sh
ExecStop=/home/nvidia/autopilot_shutdown.sh
TimeoutSec=70
TimeoutStopSec=71
[Install]
WantedBy=multi-user.target

脚本下载:https://gitee.com/hiyanyx/systemctl-self-start-upon-startup

sudo cp /home/nvidia/autopilotV2/autopilot.service /lib/systemd/system/

重新载入系统脚本,

sudo systemctl daemon-reload

启动:

systemctl start mongodb

查看状态是

systemctl status mongodb

关闭重启是

systemctl stop和restart mongodb

添加开机启动是:

sudo systemctl enable  autopilot.service
sudo systemctl disable autopilot.service

4、自启动 /etc/init.d/rcS 和 systemctl 的区别是什么?

/etc/init.d/rcS 和 systemctl 都是用于管理系统服务的工具,但它们在功能和用法上有一些区别。

/etc/init.d/rcS 是一个传统的 Linux 启动脚本,通常在系统启动时运行。它包含了各种系统服务的启动和停止命令。在 Linux 系统中,启动脚本是放在 /etc/init.d/ 目录下的,这些脚本在系统启动时按顺序执行,用于启动各种系统服务。其中,rcS 是一个特殊的启动脚本,通常被用来初始化系统环境,它的内容主要是调用 /etc/init.d/rcN.N 脚本(N.N 表示脚本的版本号)。

systemctl 是 systemd 系统和服务管理工具的命令行接口。systemd 是 Linux 系统上一个重要的初始化系统,它取代了 SysVinit 系统,成为了现代 Linux 系统上默认的初始化系统。systemctl 命令可以用来管理系统上运行的服务以及其他与 systemd 系统相关的功能。通过 systemctl 命令,我们可以控制服务的启动、停止、重启、查看状态等操作,还可以设置服务在开机时自动启动或禁用等。

总的来说,/etc/init.d/rcS 和 systemctl 都是用于管理系统服务的工具,但它们的使用方式和功能略有不同。/etc/init.d/rcS 更适用于传统的 Linux 启动脚本管理方式,而 systemctl 则提供了更为全面和灵活的服务管理功能。

自启动的多种方式

在Linux系统中,如果你想让开机自动运行的脚本具有管理员权限(即root权限),但不希望手动输入密码,有几种方法可以实现这一目标:

  1. 使用sudoers文件
    你可以编辑/etc/sudoers文件来允许特定的用户或命令无需密码即可执行sudo。为了安全起见,建议使用visudo命令来编辑此文件,因为visudo会检查你的编辑是否有语法错误。
    例如,如果你想让脚本/path/to/your/script.sh能够无密码运行,你可以添加以下行:
username ALL=(ALL) NOPASSWD: /path/to/your/script.sh

其中username是运行脚本的用户名。这样,当这个用户执行这个脚本时,sudo就不会要求输入密码。

  1. 使用setuid位
    你可以设置脚本文件的setuid位,使其以文件所有者的身份(通常是root)执行。这样,即使脚本由普通用户启动,它也会以root权限运行。
sudo chmod u+s /path/to/your/script.sh

但是,这种方法要求脚本内部不需要输入任何密码,因为一旦设置了setuid位,脚本将以root身份执行所有命令。

  1. 使用root的cron作业
    你可以在root的cron作业中设置脚本的自动执行。这样,cron守护进程(作为root运行)将执行脚本,而不需要任何密码。
sudo crontab -e

然后在cron作业中添加类似以下的行:

@reboot /path/to/your/script.sh

这将在系统启动时执行脚本。

  1. 使用init.d脚本或systemd服务
    如果你的系统使用Systemd作为初始化系统,你可以创建一个systemd服务文件,并在其中指定脚本的执行。这种方法允许你定义脚本的启动条件,并且可以通过设置适当的权限来避免密码提示。
    例如,创建一个名为your-script.service的systemd服务文件:
[Unit]
Description=My Script
After=network.target

[Service]
Type=simple
ExecStart=/path/to/your/script.sh
Restart=always
User=root

[Install]
WantedBy=multi-user.target

然后启用服务:

sudo systemctl enable your-script.service

这将使得脚本在系统启动时自动运行。

安全注意事项

  • 自动化root权限的脚本执行可能会导致安全问题,因为它允许脚本无限制地访问系统资源。确保你完全信任并理解脚本的功能。
  • 尽量避免在脚本中硬编码root密码,因为这会导致安全风险。
  • 使用上述方法时,请确保你已经仔细考虑了潜在的安全隐患,并且只在必要时才允许脚本以root权限运行。