1.带有权限的代码(权限的区别就是一个代码里加了sudo一个没有)
install_service.sh
脚本将应用程序作为系统服务进行安装和管理,提供了更多的自动化和稳定性。start.sh
脚本直接运行应用程序
首先写一个服务install_service.sh(名字随便起,后缀是到了板子下得用这个,写代码先用python就行)紫色的是代码,黑色的是注释
#!/bin/bash
# 指定脚本的解释器,这里是 bash。script_path=$(cd "$(dirname "$0")" && pwd)
# 获取脚本所在的完整目录路径。这个命令组合会先计算脚本文件($0)的目录路径,然后改变到那个目录并获取其绝对路径。# 定义变量以便后续使用
SERVICE_NAME="algo_cokin_infer"
# 设置将要创建的服务的名称。SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"
# 定义服务文件的完整路径,该文件将存储在系统的 systemd 服务目录中。WORKING_DIR="$script_path"
# 设置工作目录为脚本所在目录。# 检查工作目录是否存在
if [ ! -d "$WORKING_DIR" ]; then
echo "Error: $WORKING_DIR does not exist."
exit 1
fi
# 如果指定的工作目录不存在,则打印错误消息并退出脚本。# 检查 start.sh 是否存在
if [ ! -f "$WORKING_DIR/start.sh" ]; then
echo "Error: $WORKING_DIR/start.sh does not exist."
exit 1
fi
# 如果 start.sh 脚本文件不存在于工作目录中,则打印错误消息并退出脚本。# 创建 service 文件
cat <<EOF > "$SERVICE_FILE"
[Unit]
Description=$SERVICE_NAME service
# 服务的描述,出现在 systemd 的配置中。[Service]
User=$(whoami)
# 指定运行服务的用户为当前用户。ExecStart=/bin/bash "$WORKING_DIR/start.sh"
# 设置服务启动时执行的命令,这里是运行 start.sh 脚本。WorkingDirectory=$WORKING_DIR
# 设置服务的工作目录。Restart=on-failure
# 服务失败时自动重启。RestartSec=10
# 服务重启之前等待的秒数。[Install]
WantedBy=multi-user.target
EOF
# 设置服务在哪个系统级别下被自动启动,这里是 multi-user.target。# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 使用 sudo 权限重新加载 systemd 的配置,使得任何对服务文件的修改生效。# 启用并启动 service
sudo systemctl enable "$SERVICE_NAME.service"
# 使用 sudo 权限启用服务,使其在系统启动时自动启动。sudo systemctl start "$SERVICE_NAME.service"
# 使用 sudo 权限启动服务。
然后写一个start.sh ,紫色得是代码,别的都是注释,前四条代码全是开发板添加的环境变量,开发板有几条环境变量就添加几条
# 设置 CUDA_HOME 环境变量,指定 CUDA 的安装目录,以便其他程序知道从何处找到 CUDA 相关文件。
export CUDA_HOME=/usr/local/cuda-11.4
# 更新 LD_LIBRARY_PATH 环境变量,包括 CUDA 库的路径。这是 Linux 系统用于查找动态链接库的路径列表。
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH
# 将 CUDA 的 bin 目录添加到 PATH 环境变量。这使得系统能够在任何目录下执行 CUDA 相关的命令。
export PATH=/usr/local/cuda-11.4/bin:$PATH
# 将 Anaconda 的 bin 目录添加到 PATH 环境变量。这确保了当你在命令行中输入 Python 或相关命令时,系统会首先从 Anaconda 的安装目录中查找这些命令。
export PATH="/home/jetson/anaconda3/bin:$PATH"
# 项目路径 就是要运行的.py文件的路径 # 切换当前工作目录到你的 Python 项目所在的目录。这通常是必须的步骤,因为 Python 程序可能依赖于相对路径来访问资源文件或其他脚本。
cd /home/jetson/hanjiejianguanjiqiren/hhhh
# 使用指定的 Conda 环境中的 Python 解释器执行 Python 程序。这里指定的是 `jetson` 环境中的 Python 解释器, # 脚本路径是 `/home/jetson/hanjiejianguanjiqiren/hhhh/hanjiejianguan_main.py`,这条命令将启动该 Python 程序。
/home/jetson/.conda/envs/jetson/bin/python /home/jetson/hanjiejianguanjiqiren/hhhh/hanjiejianguan_main.py
以上是sudo,启动服务需要加上sudo权限的代码,以上的代码报错跑不起来,就拿下边的
2.无权限的代码
有权限的代码在jetson orin nano4GB开发板报错,我这边用无权限的这个跑了一下没问题,不知道啥原因,有知道的评论区告诉我下
首先写一个服务install_service.sh(名字随便起,后缀是到了板子下得用这个,写代码先用python就行)紫色的是代码,黑色的是注释
#!/bin/bash
# 指定脚本运行的解释器为 bashscript_path=$(cd "$(dirname "$0")" && pwd)
# 将 script_path 设置为当前脚本所在的目录SERVICE_NAME="hanjiejianguanjiqiren"
# 定义服务名SERVICE_FILE="$HOME/.config/systemd/user/$SERVICE_NAME.service"
# 定义服务文件的路径WORKING_DIR="$script_path"
# 设置工作目录为脚本所在的目录# 确保用户级别的 systemd 目录存在
mkdir -p "$HOME/.config/systemd/user"
# 如果用户目录不存在,则创建它if [ ! -d "$WORKING_DIR" ]; then
echo "Error: $WORKING_DIR does not exist."
exit 1
fi
# 检查工作目录是否存在,如果不存在则打印错误并退出if [ ! -f "$WORKING_DIR/start.sh" ]; then
echo "Error: $WORKING_DIR/start.sh does not exist."
exit 1
fi
# 检查 start.sh 脚本是否存在,如果不存在则打印错误并退出cat <<EOF > "$SERVICE_FILE"
[Unit]
Description=$SERVICE_NAME service[Service]
Environment="CUDA_HOME=/usr/local/cuda-11.4"
# 设置 CUDA_HOME 环境变量
Environment="LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH"
# 设置 LD_LIBRARY_PATH 环境变量,添加 CUDA 库路径
Environment="PATH=/usr/local/cuda-11.4/bin:/home/jetson/anaconda3/bin:$PATH"
# 设置 PATH 环境变量,添加 CUDA 可执行文件和 Anaconda 的 bin 目录
ExecStart=/bin/bash "$WORKING_DIR/start.sh"
# 定义服务启动时执行的命令
WorkingDirectory=$WORKING_DIR
# 设置服务的工作目录
Restart=on-failure
# 设置服务失败时重启
RestartSec=10
# 设置服务重启前的等待时间[Install]
WantedBy=default.target
# 定义服务应该被哪个目标单元文件所需要
EOF# 重新加载 systemd 配置,启用并启动服务,这里不再需要 sudo
systemctl --user daemon-reload
# 重新加载用户级别的 systemd 配置
systemctl --user enable "$SERVICE_NAME.service"
# 启用服务,使其在启动时自动运行
systemctl --user start "$SERVICE_NAME.service"
# 启动服务
然后写一个start.sh ,紫色得是代码,别的都是注释,前四条代码全是开发板添加的环境变量,开发板有几条环境变量就添加几条
环境变量
export CUDA_HOME=/usr/local/cuda-11.4
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-11.4/bin:$PATH
export PATH="/home/jetson/anaconda3/bin:$PATH"#这行的意思就是切换到你代码程序目录下
cd /home/jetson/hanjiejianguanjiqiren/hhhh#这行代码就是虚拟环境的路径+项目的运行文件的绝对路径 jetson是我的环境名
/home/jetson/.conda/envs/jetson/bin/python /home/jetson/hanjiejianguanjiqiren/hhhh/hanjiejianguan_main.py
服务的命令
systemctl status <service-name>:查询服务的状态信息,包括是否正在运行、最近一次启动时间、进程 ID 等。
systemctl start <service-name>:启动服务。
systemctl stop <service-name>:停止服务。
systemctl restart <service-name>:重启服务。
systemctl enable <service-name>:设置服务开机自启。
systemctl disable <service-name>:关闭服务开机自启。
hanjiejianguanjiqiren.service就是这块的名字(随便起,基本就是项目名)
这条命令查看服务状态(无权限的代码)
systemctl --user status hanjiejianguanjiqiren.service
有权限的命令
sudo systemctl --user status hanjiejianguanjiqiren.service
成功的大概样子
完事重启板子,板子就会自启程序了