• 关于ubuntu设置sh文件开机自启动python3和sudo python3问题


    关于ubuntu设置sh文件开机自启动python3和sudo python3问题

    说明

    系统为 ubuntu22.04

    python是python3.10.12

    ros系统为ros2 humble

    背景

    将一个py文件设置为开机自启动,服务启动时报错,显示找不到rclpy模块。
    直接运行./autotest.sh没有问题,sudo ./autotest.sh报错如下。

    在这里插入图片描述

    解决方法

    1、打开两个终端,分别输入以下命令,如下图所示。

    python3
    import sys
    sys.path
    和
    sudo python3
    import sys
    sys.path
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    2、查看上图打印结果,找到sudo python3那边没有的部分,如上图红框显示。
    3、将缺少部分写在XXX.pth文件中,并保存于 /usr/local/lib/python3.10/dist-packages/路径下(路径根据自己实际情况修改,应该可以写在一个pth文件中吧,我也没查,就直接写了两个),如下图所示。
    在这里插入图片描述
    4、此时运行还会缺少一些so文件,报错如下:

    Traceback (most recent call last): File “/home/tls/ws/firbot/ui_design/bringup.py”, line 8, in import rclpy File “/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/init.py”, line 49, in from rclpy.signals import install_signal_handlers File “/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/signals.py”, line 15, in from rclpy.exceptions import InvalidHandle File “/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/exceptions.py”, line 15, in from rclpy.impl.implementation_singleton import rclpy_implementation as _rclpy File “/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/impl/implementation_singleton.py”, line 32, in rclpy_implementation = import_c_library(‘._rclpy_pybind11’, package) File “/opt/ros/humble/lib/python3.10/site-packages/rpyutils/import_c_library.py”, line 39, in import_c_library return importlib.import_module(name, package=package) File “/usr/lib/python3.10/importlib/init.py”, line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) ImportError: librcl_action.so: cannot open shared object file: No such file or directory The C extension ‘/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/_rclpy_pybind11.cpython-310-x86_64-linux-gnu.so’ failed to be imported while being present on the system. Please refer to ‘https://docs.ros.org/en/{distro}/Guides/Installation-Troubleshooting.html#import-failing-even-with-library-present-on-the-system’ for possible solutions

    解决方法为:找到你所缺文件(如librcl_action.so)路径,创建一下软链接就可以了。

    sudo ln -s /opt/ros/humble/lib/lib* /usr/lib
    
    • 1

    补充

    1、开机自启动的autotest.sh文件放在了/etc/init.d/目录下,如下图所示。
    在这里插入图片描述2、进入 /etc/systemd/system/ 目录:

    cd /etc/systemd/system/
    
    • 1

    3、创建一个名为 autotest.service 的服务单元文件:

    sudo nano autotest.service
    
    • 1

    4、在打开的文件中,输入以下内容(请根据实际情况进行修改):

    [Unit]
    Description=Autotest Service
    After=network.target
    
    [Service]
    User=username
    Group=username
    ExecStart=/etc/init.d/autotest.sh start
    
    [Install]
    WantedBy=default.target
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上述配置假设你已经将 autotest.sh 脚本文件放在 /etc/init.d/ 目录下。如果脚本文件的位置不同,请相应调整 ExecStart 的路径。记得给权限!!!
    5、使用以下命令重新加载 systemd 服务配置。

    sudo systemctl daemon-reload
    
    • 1

    2、都设置完之后可以启动一下看一下是否启动成功,下图是启动成功的状态。

    sudo service autotest.sh start 或 sudo systemctl start autotest.service
    sudo service autotest.sh status
    
    • 1
    • 2

    也可通过命令关闭。

    sudo service autotest.sh stop
    
    • 1

    在这里插入图片描述
    最后,重启系统就可以看下是否设置成功了。

  • 相关阅读:
    10:00面试,10:04就出来了 ,问的实在是太...
    基于Springboot实现点餐平台网站管理系统项目【项目源码+论文说明】
    防火防盗防CDN流量盗刷
    MySQL如何输出发生死锁的SQL到日志文件
    基于Docker搭建Redis集群并进行扩容、缩容教程
    Maven:通过相对路径向jar中添加依赖项
    单例模式——C++版本
    马上金九银十了,简历该准备起来了,看这里
    Flink之Watermark水印、水位线
    RabbitMQ快速入门
  • 原文地址:https://blog.csdn.net/weixin_46237892/article/details/133179264