希望将自己的application在树莓派(Raspberry Pi ),做成开机自动运行,进行了一些实践,如下:
测试环境:树莓派,管理员:root,普通用户:haochuang
实现目标:在Linux启动时,自动运行位于普通用户haochuang根目录下的脚本程序osprey,该程序会在每次执行时自动向本地日志文件追加一条记录,源码如下:
1. 准备好相应的 application
#!/bin/sh ### BEGIN INIT INFO # Provides: osprey # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Required-Start: $local_fs # Required-Stop: # chkconfig: 12345 99 05 # Short-Description: Start or stop the Osprey App. ### END INIT INFO start(){ echo -n "start osprey" cd /home/lifeccp/webapp/osprey su haochuang -c "java -jar osprey-*.jar --spring.profiles.active=test &" } stop(){ echo -n "stop osprey" } case $1 in start) start ;; stop) stop ;; *) echo "Usage: $0 (start|stop)" ;; esac
2.为程序增加可执行权限,并将程序放到 /etc/init.d/
mv osprey /etc/init.d/
chmod +r /etc/init.d/osprey
3.安装chkconfig
sudo apt-get install chkconfig
如果安装失败,则使用下面命令再次尝试:
sudo apt-get install chkconfig --fix-missing
4.运行chkconfig --add osprey, 把该服务添加到配置当中
5.运行chkconfig --list osprey,可以查看该服务进程的状态
6.完了之后,reboot一下,并查看进程,进行验证;
由于我增加了两个服务,结果截图如下:
补充1,方案的解释:
切换用户到haochuang,然后执行命令启动应用程序;
su haochuang --切换到相应用户 cd /home/haochuang --切换到根目录 java -jar osprey-1.0.4.jar --spring.profiles.active=test & --执行应用程序 exit --退出帐号
做成服务的好处是可以定义多个交互命令,比如:start,stop,restart,reset...,在服务运行的过程中还可以做相应操作。
看起来好象一切都没错,但是发现只运行了第一行的命令,后面的都没有运行,直到退出lifeccp用户后才发现好象执行完毕。
分析原因,是因为Linux启动的时候是在root帐号下,执行su lifeccp等于打开了一个新的shell脚本,因此下面的代码都在等着新的Shell脚本结束才能运行,就象在主程序里调用了一个子程序,而子程序是个死循环,一下出来来结果下面的要等死了。
在执行上述脚本程序时,不要离开本身的Shell。我们可以把执行命令做为su的一个参数传递进去,因为没有涉及到打开新的Shell,因此可以正常执行你期望的脚本程序,顺利实现开机自动启动指定的脚本程序。
补充2,如果执行 sudo apt-get install chkconfig 一直报错,安装不成功,那么需要检查如下几点:
- 检查设备网络情况是否正常,确保设备网络本身可通达内外网;
- 更新一下系统配置:sudo apt-get update
然后再次重试。
如果有问题,请参考另一篇新的:【树莓派】在树莓派上制作开机自启动程序及服务2