Linux rc.d路径下文件执行时候把日志输出到log

有时我们自己在/etc/rc.d/rc.local里面增加的随机器启动的脚本和指令总是不能自动加载和启动,类似的还有/etc/rc.d/init.d里面的各种系统启动项,

机器启动后手动执行脚本又能成功,经常被搞得晕头转向的。经过测试和查找资料,终于解决了这问题,解决方式如下


/etc/rc.d/rc.local文件的文件头是#!/bin/sh ,我们把这修改成#!/bin/sh -x,这样系统启动后就会把/etc/rc.d/rc.local里面的指令或脚本不能执行的日志写入/var/log/messages

,我们查看messages文件内容就知道具体的问题出在哪里了


--

例如 /etc/rc.d/init.d/tomcat8   的出错日志如下

Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: ++ expr 'lrwxrwxrwx 1 root root 59 Oct  8 15:18 /etc/rc.d/init.d/tomcat8 -> /usr/programfile/tomcat/apache-tomcat-8.0.27/bin/startup.sh' : '.*-> \(.*\)$'
Oct  8 15:54:49 iZ23psiz6rgZ systemd: Started OpenSSH server daemon.
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: + link=/usr/programfile/tomcat/apache-tomcat-8.0.27/bin/startup.sh
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: + expr /usr/programfile/tomcat/apache-tomcat-8.0.27/bin/startup.sh : '/.*'
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: + PRG=/usr/programfile/tomcat/apache-tomcat-8.0.27/bin/startup.sh
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: + '[' -h /usr/programfile/tomcat/apache-tomcat-8.0.27/bin/startup.sh ']'
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: ++ dirname /usr/programfile/tomcat/apache-tomcat-8.0.27/bin/startup.sh
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: + PRGDIR=/usr/programfile/tomcat/apache-tomcat-8.0.27/bin
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: + EXECUTABLE=catalina.sh
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: + false
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: + '[' '!' -x /usr/programfile/tomcat/apache-tomcat-8.0.27/bin/catalina.sh ']'
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: + exec /usr/programfile/tomcat/apache-tomcat-8.0.27/bin/catalina.sh start start
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
Oct  8 15:54:49 iZ23psiz6rgZ tomcat8: At least one of these environment variable is needed to run this program


说明在tomcat8里面需要定义JAVA_HOME 环境变量(此时系统还未启动完毕,JAVA_HOME尚未被定义)

<think>嗯,用户想了解如何在rc.local文件中以root权限执行Qt程序。首先,我需要回忆一下rc.local的作用。它是Linux系统中的一个启动脚本,通常用于在系统启动时运行用户自定义的命令或程序。不过,现在很多发行版已经改用systemd了,可能用户还在用支持rc.local的系统,比如Ubuntu或者Debian的某个版本。 接下来,用户提到要用root权限执行Qt程序。这里有几个关键点需要考虑。首先,rc.local本身是以root权限运行的,所以在其中执行的命令默认也是root权限。但是,执行图形界面程序可能会遇到问题,因为root用户的环境变量可能没有设置正确,尤其是DISPLAY变量,这可能导致Qt程序无法连接到X服务器。 然后,我需要确认用户是否真的需要以root权限运行Qt程序。通常,图形界面程序不建议用root运行,因为这有安全风险。如果确实有必要,可能需要配置X服务器的权限,比如通过xhost命令允许root用户访问显示服务。但这一步需要谨慎处理,否则可能带来安全隐患。 另外,Qt程序可能依赖某些库或环境变量,特别是如果程序使用了特定的硬件资源或需要访问某些设备文件,权限问题也可能出现。需要确保程序需要的所有资源在启动时都是可用的,并且权限设置正确。 接下来,我应该考虑如何正确编写rc.local中的命令。可能需要使用绝对路径来指定Qt程序的位置,避免因为环境变量不同导致的找不到命令的问题。同时,可能需要添加延迟,确保网络或其他服务已经启动,特别是在系统启动的早期阶段。 还有,用户可能需要将程序的输出重定向到日志文件,以便调试。因为rc.local中的命令在后台运行,如果没有重定向,可能看不到任何输出,出现问题难以排查。 然后,检查rc.local文件的可执行权限是否正确,确保系统在启动时能够执行该脚本。此外,如果使用的是systemd的系统,可能需要启用rc-local服务,否则脚本不会被执行。 最后,需要提醒用户注意安全风险,以root权限运行图形程序可能存在漏洞被利用的风险。建议尽可能以普通用户权限运行,并通过其他方式(如权限组、sudoers配置)来管理必要的权限。 总结一下,回答应该包括以下几个步骤:确保rc.local可用性,编写正确的启动命令(包括环境变量设置和延迟),处理X服务器权限,检查路径和依赖,以及安全注意事项。同时,要结构清晰,逐步引导用户完成配置,并强调安全方面的建议。</think>### 使用 `rc.local` 以 root 权限执行 Qt 程序的步骤解析 --- #### **1. 基础概念** - **`rc.local`** 是 Linux 系统中一个传统的启动脚本,在系统启动时自动执行(需 root 权限)。 - **Qt 程序** 若涉及硬件操作(如 GPIO、USB)或需要 root 权限的功能,可能需通过 `rc.local` 启动。 --- #### **2. 关键问题与解决方案** **问题 1:环境变量缺失** Qt 程序依赖图形环境变量(如 `DISPLAY`),但 `rc.local` 运行时可能未加载桌面环境。 **解决方法**: ```bash # 在 rc.local 中显式指定环境变量 export DISPLAY=:0 export XAUTHORITY=/home/用户名/.Xauthority ``` **问题 2:权限冲突** 以 root 运行 Qt 程序可能导致文件权限问题(如日志文件属主为 root)。 **解决方法**: ```bash # 切换用户执行(非必须root时推荐) su - 用户名 -c "/path/to/your_qt_program" ``` --- #### **3. 具体配置步骤** **步骤 1:确保 `rc.local` 可用性** - 现代系统(如 Ubuntu 18.04+)默认禁用 `rc.local`,需手动启用: ```bash sudo systemctl enable rc-local.service ``` **步骤 2:编辑 `rc.local` 文件** ```bash sudo nano /etc/rc.local ``` 添加以下内容(示例): ```bash #!/bin/sh -e # 设置环境变量 export DISPLAY=:0 export XAUTHORITY=/home/pi/.Xauthority # 替换为实际用户 # 延迟等待桌面加载(可选) sleep 10 # 以 root 执行 Qt 程序(绝对路径!) /path/to/your_qt_program & exit 0 ``` **步骤 3:设置可执行权限** ```bash sudo chmod +x /etc/rc.local ``` --- #### **4. 调试与日志记录** - **查看启动日志**: ```bash journalctl -u rc-local.service -b ``` - **重定向程序输出**(在 `rc.local` 中): ```bash /path/to/your_qt_program > /var/log/qt_program.log 2>&1 & ``` --- #### **5. 安全注意事项** - **避免长期以 root 运行**:尽量通过 `sudoers` 分配最小权限。 - **X 服务器权限**:若需 root 访问图形界面,临时允许 root 连接: ```bash xhost +SI:localuser:root ``` (完成后撤销:`xhost -SI:localuser:root`) --- #### **6. 替代方案** - **Systemd 服务**(推荐):创建自定义服务文件(如 `/etc/systemd/system/qt_program.service`): ```ini [Unit] Description=My Qt Program After=graphical.target [Service] Environment="DISPLAY=:0" ExecStart=/path/to/your_qt_program User=root # 或指定普通用户 [Install] WantedBy=multi-user.target ``` --- **总结**:通过 `rc.local` 启动 Qt 程序需关注环境变量、权限和延迟问题。推荐优先使用 systemd 服务管理,以提高可控性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值