通过 /etc/init.d 的 Raspian 自动启动问题
Problems with Raspian autostart via /etc/init.d
(抱歉英语不好,我是德国人)
我正在尝试(没有成功)让我自己的程序在启动后自动启动(在带有 raspian 的树莓派上)。
这是我的脚本:(注意:你必须运行这个程序具有root权限)(注意#2:必须有一个名为“/home/testLog.txt”的空文件,每个用户都有写权限) :
rm /etc/init.d/RMStart
echo "
#! /bin/sh
### BEGIN INIT INFO
# Provides: bla1
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: bla2
# Description: bla3
### END INIT INFO
#Switch case for the first parameter
case \"$1\" in
start)
echo \"Start\" >> /home/testLog.txt
echo runlevel >> /home/testLog.txt
;;
stop)
echo \"Stop\" >> /home/testLog.txt
echo runlevel >> /home/testLog.txt
;;
restart)
echo \"Restart\" >> /home/testLog.txt
echo runlevel >> /home/testLog.txt
;;
*)
echo \"something else\" >> /home/testLog.txt
;;
esac
exit 0
" >> /etc/init.d/RMStart
chmod +x /etc/init.d/RMStart
update-rc.d RMStart remove #Remove older versions of this program ... in theory
update-rc.d RMStart defaults #Install new version of this program ... in theory
我已经重启了树莓派,但是文件 /home/testLog.txt 仍然是空的。
但是,如果我 运行 命令:“/etc/init.d/RMStart”或“/etc/init.d/RMStart start” [=30= 中有一个新条目.txt.
如果有人知道为什么文件 /home/testLog.txt 仍然是空的以及我该如何解决这个问题,我将不胜感激。
更新:
我尝试了一个新的安装脚本:
#RMS install script
chmod +x botComp.sh
rm /home/pi/RMS
pkill RMS
./botComp.sh
cp RMS /home/pi
chmod +x /home/pi/RMS
rm /etc/init.d/startRMS
sudo echo "#!/bin/sh
### BEGIN INIT INFO
# Provides: fqew
# Required-Start:
# Required-Stop:
# Default-Start: 3 4 5
# Default-Stop: 0 1 6
# Short-Description: sfwef
# Description: gfewf
### END INIT INFO
# Actions
case \"$1\" in
start)
# START
su pi sh -c \" /home/pi/RMS \"
;;
stop)
# STOP
;;
restart)
# RESTART
;;
esac
exit 0 " >> /etc/init.d/startRMS
chmod +x /etc/init.d/startRMS
update-rc.d startRMS remove
update-rc.d startRMS defaults
我能看到的唯一区别是脚本的名称(/etc/init.d/startRMS 而不是 /etc/init.d/RMStart)。
该脚本有效,RMS 为 运行ning。
这不是真正的问题,但脚本输出:
insserv: script RMStart: service F already provided!
insserv: script RMStart: service F already provided!
我添加了行 system("运行level >> /home/pi/runlevelLog.txt");在程序中(RMS)但是/home/pi/runlevelLog.txt的内容是:"unknown".
RMS 是否从 运行3 级开始?我如何验证这一点? (我认为 运行 级别 3 是理想的,因为 RMS 需要网络连接。)感谢您的帮助。
是/etc/init。d/RMStart肯定是在重启时执行的?使用 ls -lu 检查上次访问文件的时间,在重新启动前等待一分钟,并在备份后重复该命令。如果访问时间没有继续,那么你的脚本不是 运行 这将解释空文件,因为你的脚本看起来不错。
您还应该仔细检查 update-rc.d 是否已在适当的 运行 级别指令中创建指向脚本的符号链接,例如/etc/rc2.d/RMStart 存在吗?
另一个健全性检查是 运行 使用上述目录中的符号链接而不是来自 /etc/init.d 的符号链接来编写您的脚本,例如/etc/rc2.d/RMStart
在 /home/testLog.txt
?
中生成输出
让我知道你找到了什么,我们会从那里拿走它。
编辑:试图复制..
好吧,我设法找到了我的 PI;好消息是我们俩都没有发疯,因为它第一次就如我们所相信的那样完美运行。
我复制了一份你的文件,并编写了一个快速脚本 (x) 来检查 update-rc.d
的退出代码,只是为了 100% 确定它没有抱怨任何事情。
希望您能按照我在上面的屏幕截图中所做的操作 - 我几乎完全复制了您遵循的步骤,并在此过程中进行了一些额外的检查。该脚本在直接调用时肯定会按设计工作。
然后我立即重新启动并在系统启动后立即检查 testLog.txt
。您可以在文件中看到两个条目,这是预期的行为,因为当系统因重新启动而关闭时,init 将具有 运行 /etc/rc6.d/K01RMStart
,而当它再次出现时,将具有 /etc/rc5.d/S01RMStart
。
不幸的是,这对你帮助不大......
我们的测试之间唯一显着的区别是我 运行 一切都是 root 而不是使用 sudo。这应该不会有什么不同,但您接下来要尝试的合乎逻辑的事情可能是完全复制我的测试并查看它是否适合您?
并不是说这应该很重要,但我 运行ning Raspbian 8(内核 4.1.13+)。
EDIT2:太棒了……很棒的东西。我仍然想知道问题出在哪里,但最主要的是它能正常工作。
基于 System V 的发行版通常会在级别 3 或级别 5 中启动,区别在于级别 5 将启动 GUI 而级别 3 将以文本模式启动,它们的默认 运行级别由/etc/inittab
中的一行。
Debian(Raspian) 发行版有点不同 - (https://www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit)。他们在 运行 级别 2-5 之间没有区别,并让用户通过使用过去 24 小时一直让我们痛苦的机制添加服务来配置它们以满足他们的要求。它们总是从第 5 级开始,除非设置了 "init="
内核引导参数,您可以在引导时或使用 bum
或 raspi-config
.
之类的工具执行此操作
命令 runlevel
会告诉你 raspian 的当前级别。
如果需要,您可以使用 telinit new_runlevel
即时更改 运行 级别,但无论您做什么,都不要将默认 运行 级别设置为 0 :- )
(抱歉英语不好,我是德国人) 我正在尝试(没有成功)让我自己的程序在启动后自动启动(在带有 raspian 的树莓派上)。 这是我的脚本:(注意:你必须运行这个程序具有root权限)(注意#2:必须有一个名为“/home/testLog.txt”的空文件,每个用户都有写权限) :
rm /etc/init.d/RMStart
echo "
#! /bin/sh
### BEGIN INIT INFO
# Provides: bla1
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: bla2
# Description: bla3
### END INIT INFO
#Switch case for the first parameter
case \"$1\" in
start)
echo \"Start\" >> /home/testLog.txt
echo runlevel >> /home/testLog.txt
;;
stop)
echo \"Stop\" >> /home/testLog.txt
echo runlevel >> /home/testLog.txt
;;
restart)
echo \"Restart\" >> /home/testLog.txt
echo runlevel >> /home/testLog.txt
;;
*)
echo \"something else\" >> /home/testLog.txt
;;
esac
exit 0
" >> /etc/init.d/RMStart
chmod +x /etc/init.d/RMStart
update-rc.d RMStart remove #Remove older versions of this program ... in theory
update-rc.d RMStart defaults #Install new version of this program ... in theory
我已经重启了树莓派,但是文件 /home/testLog.txt 仍然是空的。 但是,如果我 运行 命令:“/etc/init.d/RMStart”或“/etc/init.d/RMStart start” [=30= 中有一个新条目.txt.
如果有人知道为什么文件 /home/testLog.txt 仍然是空的以及我该如何解决这个问题,我将不胜感激。
更新: 我尝试了一个新的安装脚本:
#RMS install script
chmod +x botComp.sh
rm /home/pi/RMS
pkill RMS
./botComp.sh
cp RMS /home/pi
chmod +x /home/pi/RMS
rm /etc/init.d/startRMS
sudo echo "#!/bin/sh
### BEGIN INIT INFO
# Provides: fqew
# Required-Start:
# Required-Stop:
# Default-Start: 3 4 5
# Default-Stop: 0 1 6
# Short-Description: sfwef
# Description: gfewf
### END INIT INFO
# Actions
case \"$1\" in
start)
# START
su pi sh -c \" /home/pi/RMS \"
;;
stop)
# STOP
;;
restart)
# RESTART
;;
esac
exit 0 " >> /etc/init.d/startRMS
chmod +x /etc/init.d/startRMS
update-rc.d startRMS remove
update-rc.d startRMS defaults
我能看到的唯一区别是脚本的名称(/etc/init.d/startRMS 而不是 /etc/init.d/RMStart)。 该脚本有效,RMS 为 运行ning。 这不是真正的问题,但脚本输出:
insserv: script RMStart: service F already provided!
insserv: script RMStart: service F already provided!
我添加了行 system("运行level >> /home/pi/runlevelLog.txt");在程序中(RMS)但是/home/pi/runlevelLog.txt的内容是:"unknown".
RMS 是否从 运行3 级开始?我如何验证这一点? (我认为 运行 级别 3 是理想的,因为 RMS 需要网络连接。)感谢您的帮助。
是/etc/init。d/RMStart肯定是在重启时执行的?使用 ls -lu 检查上次访问文件的时间,在重新启动前等待一分钟,并在备份后重复该命令。如果访问时间没有继续,那么你的脚本不是 运行 这将解释空文件,因为你的脚本看起来不错。
您还应该仔细检查 update-rc.d 是否已在适当的 运行 级别指令中创建指向脚本的符号链接,例如/etc/rc2.d/RMStart 存在吗?
另一个健全性检查是 运行 使用上述目录中的符号链接而不是来自 /etc/init.d 的符号链接来编写您的脚本,例如/etc/rc2.d/RMStart
在 /home/testLog.txt
?
让我知道你找到了什么,我们会从那里拿走它。
编辑:试图复制..
好吧,我设法找到了我的 PI;好消息是我们俩都没有发疯,因为它第一次就如我们所相信的那样完美运行。
我复制了一份你的文件,并编写了一个快速脚本 (x) 来检查 update-rc.d
的退出代码,只是为了 100% 确定它没有抱怨任何事情。
希望您能按照我在上面的屏幕截图中所做的操作 - 我几乎完全复制了您遵循的步骤,并在此过程中进行了一些额外的检查。该脚本在直接调用时肯定会按设计工作。
然后我立即重新启动并在系统启动后立即检查 testLog.txt
。您可以在文件中看到两个条目,这是预期的行为,因为当系统因重新启动而关闭时,init 将具有 运行 /etc/rc6.d/K01RMStart
,而当它再次出现时,将具有 /etc/rc5.d/S01RMStart
。
不幸的是,这对你帮助不大......
我们的测试之间唯一显着的区别是我 运行 一切都是 root 而不是使用 sudo。这应该不会有什么不同,但您接下来要尝试的合乎逻辑的事情可能是完全复制我的测试并查看它是否适合您?
并不是说这应该很重要,但我 运行ning Raspbian 8(内核 4.1.13+)。
EDIT2:太棒了……很棒的东西。我仍然想知道问题出在哪里,但最主要的是它能正常工作。
基于 System V 的发行版通常会在级别 3 或级别 5 中启动,区别在于级别 5 将启动 GUI 而级别 3 将以文本模式启动,它们的默认 运行级别由/etc/inittab
中的一行。
Debian(Raspian) 发行版有点不同 - (https://www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit)。他们在 运行 级别 2-5 之间没有区别,并让用户通过使用过去 24 小时一直让我们痛苦的机制添加服务来配置它们以满足他们的要求。它们总是从第 5 级开始,除非设置了 "init="
内核引导参数,您可以在引导时或使用 bum
或 raspi-config
.
命令 runlevel
会告诉你 raspian 的当前级别。
如果需要,您可以使用 telinit new_runlevel
即时更改 运行 级别,但无论您做什么,都不要将默认 运行 级别设置为 0 :- )