我有一个 IoT 设备,上面有一个准系统 Linux 发行版。不crontab
,,chkconfig
或update-rc
。
当设备启动时,设备上的所有内容都已加载后,我将如何运行脚本?我以为我可以添加脚本,/etc/init.d
但似乎什么也没有发生。这是我正在使用的脚本。
#! /bin/sh -e
# /etc/init.d/camstart
. /etc/init.d/functions.sh
start() {
/usr/local/packages/application/myapp
}
stop() {
kill `pidof myapp`
kill `pidof myappinternal`
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
pidof myapp
pidof myappinternal
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
我的另一个想法是使用/etc/rc.local
,但设备没有该文件。它有rc?.d
从 1-6 到 S 的文件夹。将脚本放在其中任何一个中似乎都没有任何影响。
有什么建议么?
编辑:我不确定它是什么 Linux 发行版,但检查/etc/*release
告诉我它是基于 Yocto 项目的 Poky 的。从/proc/version
Linux 版本 4.9.62 开始。
据我所知,它用于systemctl
启动systemd
服务。
EDIT2:忘了提及。我尝试systemd
为我的脚本编写一个服务并使用它启动它systemctl start app
,但它立即退出exit code 0
。
应用程序服务器:
[Unit]
Description=app
After=acap-pre.target
Requires=acap-pre.target
[Service]
Slice=extension-acap.slice
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/init.d/app start
ExecStop=/etc/init.d/app stop
最终编辑:查看后可以正常工作如何编写systemd的启动脚本发现我的systemd service
失踪了
[Install]
WantedBy=multi-user.target
答案1
在运行级别 3 中自动启动守护进程的过程很简单:
- 将您的脚本放入
/etc/init.d
, - 检查脚本的权限和所有权,
/etc/rc3.d
使用以下名称创建到脚本的符号链接S99scriptmame
。
办法S
启动服务。该数字用于对服务启动顺序进行排序,从01
(高优先级脚本)到99
(最后优先级脚本)。
/etc/rc0.d
也许,您是否需要在名为 的(停止)和/etc/rc6.d
(重新启动)中创建脚本的链接K01scriptname
。通常最后启动的守护进程是第一个被停止的。
看man init.d
^1以获得完整的解释。