开机自启动脚本

文章详细介绍了如何在Linux系统中通过systemd服务管理器创建和配置服务文件,以实现Shell脚本程序的开机自启动。步骤包括创建服务文件、设置服务描述、启动和激活服务,以及处理screen会话自动退出的问题。此外,还涉及到ROS环境的配置和使用screen启动ROS节点。
摘要由CSDN通过智能技术生成

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值