在Linux系统中,可以使用systemd服务管理器来实现Shell脚本程序的开机自启动。下面是具体的步骤:
创建一个Shell脚本程序,例如"myscript.sh",并将其保存到一个可执行的位置,例如"/usr/local/bin"。
使用文本编辑器创建一个名为"myscript.service"的服务文件,并将其保存到"/etc/systemd/system/"目录中。文件内容如下:
[Unit]
Description=My Script Service
After=network.target
[Service]
ExecStart=/usr/local/bin/myscript.sh
Restart=always
[Install]
WantedBy=multi-user.target
其中,"Description"字段是服务的描述,"ExecStart"字段是Shell脚本程序的路径,"Restart"字段表示服务遇到错误时自动重启,"WantedBy"字段指定服务启动的目标。
在终端中运行以下命令,启动并激活服务:
sudo systemctl daemon-reload
sudo systemctl enable myscript.service
sudo systemctl start myscript.service
这将启动"myscript.service"服务,并将其设置为开机自启动。
验证服务是否已启动。在终端中运行以下命令:
sudo systemctl status myscript.service
如果服务正在运行,则应该看到"Active: active (running)"的输出。
现在,您的Shell脚本程序应该已经设置为开机自启动。如果您需要停止或重启服务,可以运行以下命令:
sudo systemctl stop myscript.service
sudo systemctl restart myscript.service
注意,如果您对服务文件进行了更改,您需要重新运行"sudo systemctl daemon-reload"命令来重新加载服务文件。
查看日志文件:
sudo journalctl -u <your_service_name>.service
如果是开主从机,由于主机bashrc里的参数传递不进systemed(source ~/.bashrc失效),所以从机接收不到主机的话题,这是在myscript.sh需要写成:
#!/bin/bash
source /opt/ros/melodic/setup.bash
export ROS_HOSTNAME=192.168.1.100
export ROS_MASTER_URI=http://192.168.1.100:11311
# Start roscore
roscore &
# Wait for roscore to start
sleep 5
source /home/nvidia/work/control_ws/devel/setup.bash
roslaunch mavros UAV_11_VIO_px4.launch
sleep 5
source /home/nvidia/work_autoflight/realsense_ros_ws/devel/setup.bash
roslaunch realsense2_camera rs_d455.launch
如果想要挂screen来启动launch文件,但是screen会话启动后又立即退出,并显示code=exited, status=0/SUCCESSED的错误消息,这可能是因为systemd认为服务已经成功完成,并因此终止了该服务。要解决这个问题,可以在shell脚本中添加一个无限循环,以确保screen会话保持运行状态。例如,可以在shell脚本中添加以下内容:
#! /bin/bash
export ROS_HOSTNAME=192.168.254.110
export ROS_MASTER_URI=http://192.168.254.110:11311
source /opt/ros/melodic/setup.bash
roscore &
sleep 2//时间太短mavros开启会有问题,报错:RLException: run_id on parameter server does not match declared run_id
source /home/nvidia/work/control_ws/devel/setup.bash
echo "mavros start"
screen -d -m -S mavros bash -c 'roslaunch mavros UAV_11_VIO_px4.launch; exec /bin/bash'
sleep 5
source /home/nvidia/work_autoflight/realsense_ros_ws/devel/setup.bash
echo "d435 start"
screen -d -m -S d435 bash -c 'roslaunch realsense2_camera rs_d455.launch; exec /bin/bash'
sleep 5
source /home/nvidia/wrzf/WRZF_base_station_ws/devel/setup.bash
echo "mission interface start"
screen -d -m -S mission bash -c 'roslaunch mission_node mission.launch; exec /bin/bash'
while true; do sleep 1; done
/etc/systemd/system/目录下wrzfscript.service最终版本代码:
[Unit]
Description=WRZF Script Service
After=network.target
[Service]
Type=simple
User=nvidia
ExecStart=/home/nvidia/wrzf/wrzfscript.sh
Restart=no
[Install]
WantedBy=multi-user.target graphical.target
wrzfscript.sh最终版本代码:
#! /bin/bash
while true; do
echo nvidia | sudo -S ntpdate 192.168.254.100
if [ $? -eq 0 ]; then
break
fi
sleep 1
#echo "ntp fail"
done
echo "ntp success"
export ROS_HOSTNAME=192.168.254.101
export ROS_MASTER_URI=http://192.168.254.101:11311
source /opt/ros/melodic/setup.bash
nohup roscore &
sleep 5
echo "roscore success"
source /home/nvidia/work/control_ws/devel/setup.bash
echo "mavros start"
screen -d -m -S mavros bash -c 'roslaunch mavros UAV_1_VIO_px4.launch; exec /bin/bash'
#sleep 5
#source /home/nvidia/work_autoflight/realsense_ros_ws/devel/setup.bash
#echo "d435 start"
#screen -d -m -S d435 bash -c 'roslaunch realsense2_camera rs_d455.launch; exec /bin/bash'
sleep 5
source /home/nvidia/wrzf/WRZF_base_station_ws/devel/setup.bash
echo "mission interface start"
screen -d -m -S mission bash -c 'roslaunch mission_node mission.launch; exec /bin/bash'
sleep 5
source /home/nvidia/wrzf/assign3/devel/setup.bash
echo "heart beat start"
screen -d -m -S heart bash -c 'roslaunch assignment run_mr.launch drone_id:=1 robot:=drone1 x_min:=-800 x_max:=-400 y_min:=-200 y_max:=200; exec /bin/bash'
while true; do sleep 1; done