(抱歉英文不好,我是德国人) 我正在尝试(没有成功)让我自己的程序在启动后自动启动(在带覆盆子的覆盆子上)。 这是我的脚本:(注意:您必须以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”,/ home / testLog.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正在运行。 这不是一个真正的问题,但脚本输出:
insserv:script RMStart:已提供服务F!
insserv:script RMStart:已提供服务F!
我添加了行系统(“runlevel>> /home/pi/runlevelLog.txt”);在程序(RMS)中,但/home/pi/runlevelLog.txt的内容为:“unknown”。
RMS是否在运行级别3开始?我怎么能验证这个? (我认为运行级别3是理想的,因为RMS需要网络连接。)感谢您的帮助。
答案 0 :(得分:0)
是/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
。/etc/inittab
。
不幸的是,这对你没什么帮助.....
我们的测试之间唯一显着的差异是我以root身份运行所有内容而不是使用sudo。这不应该有所作为,但你要尝试的下一个合乎逻辑的事情可能是完全复制我的测试并看看它是否适合你?
这不应该是重要的,但我正在运行Raspbian 8(内核4.1.13 +)。
EDIT2:棒极了......很棒的东西。我仍然想知道问题是什么,但主要是它的工作。
基于System V的发行版通常从3级或5级开始,不同之处在于5级将启动GUI,而3级将以文本模式启动,其默认运行级别由{{1}中的一行控制}。
Debian(Raspian)发行版有点不同 - (https://www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit)。他们没有区分运行级别2-5,而是让用户通过使用导致我们过去24小时痛苦的机制添加服务来配置它们以满足他们的要求。它们总是从级别5开始,除非已设置"init="
内核引导参数,您可以在引导时或使用bum
或raspi-config
等工具执行此操作。
命令runlevel
会告诉你当前的蜥蜴级别。
如果需要,您可以使用telinit new_runlevel
随时更改运行级别,但无论您做什么,都不要将默认运行级别设置为0: - )