在Ubuntu上编写一个开机自启动的Python脚本

本文介绍如何在Linux环境下设置脚本自动执行,包括使用/etc/profile、/etc/rc.local及init.d服务脚本的方法,实现服务器开机时自动运行指定Python脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写一个shell脚本文件,例如python_auto.sh,文件内容:

2.编写start.py文件,里面执行你需要服务器开启执行的操作

3.在 /etc/profile  这个文件中,添加shell脚本文件路径,例如:

在服务器开机时会自动执行 /etc/profile中的代码

注: linux随机启动的服务程序都在/etc/init.d这个文件夹里,里面的文件全部都是脚本文件,另外在/etc这个文件夹里还有诸如名为rc1.d, rc2.d一直到rc6.d的文件夹,这些都是linux不同的runlevel,我们一般进入的X windows多用户的运行级别是第5级,也就是rc5.d,在这个文件夹下的脚本文件就是运行第5级时要随机启动的服务程序。需要注意的是,在每个rc (1-6).d文件夹下的文件其实都是/etc/init.d文件夹下的文件的一个软连接,也就是说,在 /etc/init.d文件夹下是全部的服务程序,而每个rc(1-6).d只链接它自己启动需要的相应的服务程序! 还 需要注意的一点是,在rc5.d里,每个链接的名字都是以S或者K开头的,S开头的表示是系统启动是要随机启动的,K开头的是不随机启动的。这 样,你就可以知道,如果我要哪个服务随机启动,就把它名字第一个字母K改成S就可以了,当然,把S改成K后,这个服务就不能随机启动了。Ubuntu系统运行级别: 0  系统停机状态 1  单用户或系统维护状态 2~5 多用户状态 6  重新启动 

登录时自动运行程序: 用 户登录时,bash首先自动执行系统管理员建立的全局登录script :/ect/profile。然后bash在用户起始目录下按顺序查找三个特殊文件中的一个:/.bash_profile、/.bash_login、 /.profile,但只执行最先找到的一个。 因此,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序。 退出登录时自动运行程序: 退出登录时,bash自动执行个人的退出登录脚本/.bash_logout。

还有一种推荐做法:

在/etc/rc.local文件中添加一行:

/usr/bin/python2.7 /usr/local/qlya/timing_insert.py &  

&符号为让脚本后台运行,不在命令行显示结果

 

A 自带开机脚本

/etc/rc.local脚本是一个ubuntu16.04及其以前的系统中自带的开机脚本,在没有修改之前里面内容如下。

 

[plain] view plain copy

  1. #!/bin/sh -e  
  2. #  
  3. # rc.local  
  4. #  
  5. # This script is executed at the end of each multiuser runlevel.  
  6. # Make sure that the script will "exit 0" on success or any other  
  7. # value on error.  
  8. #  
  9. # In order to enable or disable this script just change the execution  
  10. # bits.  
  11. #  
  12. # By default this script does nothing.  
  13.     
  14. exit 0  

可以把开机要执行的命令放到 exit0 前面。
 

B 添加开机脚本

1,新建个脚本文件new_service.sh

 

 

[plain] view plain copy

  1. #!/bin/bash  
  2. # command content  
  3.     
  4. exit 0  


 

2,设置权限

 

[plain] view plain copy

  1. sudo chmod 755 new_service.sh  

 

3,把脚本放置到启动目录下

 

[plain] view plain copy

  1. sudo mv new_service.sh /etc/init.d/  

 

 

4,将脚本添加到启动脚本

执行如下指令,在这里90表明一个优先级,越高表示执行的越晚

 

[plain] view plain copy

  1. cd /etc/init.d/  
  2. sudo update-rc.d new_service.sh defaults 90  

 

 

移除Ubuntu开机脚本

 

[plain] view plain copy

  1. sudo update-rc.d -f new_service.sh remove

 


--------------------- 
作者:M1dor1ya 
来源:优快云 
原文:https://blog.youkuaiyun.com/qq_29113041/article/details/78675396 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>我们使用Python编写一个自动化安装ydotool的脚本。由于ydotool需要从源码编译安装,因此我们需要在脚本中执行以下步骤: 1. 安装必要的依赖包(build-essential, cmake, libevdev-dev, libwayland-dev) 2. 克隆ydotool的Git仓库 3. 创建并进入build目录 4. 使用cmake生成构建配置并编译 5. 安装编译好的程序 6. 配置udev规则以允许普通用户访问uinput设备 7. 重新加载udev规则 8. 启动ydotoold用户服务(并设置为开机启动) 注意:由于安装过程中需要sudo权限,因此脚本中需要使用sudo执行命令。我们将使用subprocess模块来执行系统命令。 另外,我们还需要考虑不同发行版的包管理器(这里以Ubuntu/Debian为例)。 脚本将按照以下步骤编写: - 检查当前用户是否具有sudo权限(通过尝试执行sudo -v) - 安装依赖 - 克隆仓库(如果已经存在,则先删除再克隆,或者使用git pull更新) - 编译安装 - 配置udev规则 - 启动服务 注意:由于启动用户服务(systemctl --user)可能需要环境变量,我们可能需要指定用户服务的环境(比如使用sudo -u $USER运行) 由于在安装过程中需要用户输入sudo密码,我们可以考虑在脚本开始时一次性获取sudo权限(通过sudo -v),然后后续命令都使用sudo。 但是,对于systemctl --user的操作,我们不需要sudo,而是以当前用户身份运行。 另外,如果是在无头服务器上运行,可能没有用户服务管理器,所以需要确保用户服务可用。 我们将编写一个函数来执行命令并检查返回状态,如果命令执行失败则退出脚本。 考虑到不同的系统环境,我们尽量使脚本健壮。 以下是脚本内容:</think>以下是一个自动化安装 `ydotool` 的 Python 脚本实现,专为 Wayland 环境设计: ```python #!/usr/bin/env python3 import os import sys import subprocess import shutil import time from pathlib import Path def run_command(cmd, sudo=False, capture_output=False): """执行系统命令并处理错误""" try: if sudo: cmd = ["sudo"] + cmd result = subprocess.run( cmd, check=True, text=True, stdout=subprocess.PIPE if capture_output else None, stderr=subprocess.PIPE if capture_output else None ) return result.stdout if capture_output else None except subprocess.CalledProcessError as e: print(f"❌ 命令执行失败: {' '.join(cmd)}") print(f"错误信息: {e.stderr}") sys.exit(1) def install_ydotool(): # 1. 检查系统依赖 print("🔍 检查系统依赖...") dependencies = ["build-essential", "cmake", "libevdev-dev", "libwayland-dev"] run_command(["apt-get", "update"]) run_command(["apt-get", "install", "-y"] + dependencies, sudo=True) # 2. 克隆仓库 print("⬇️ 克隆 ydotool 仓库...") repo_url = "https://github.com/ReimuNotMoe/ydotool.git" clone_dir = Path("/tmp/ydotool") if clone_dir.exists(): shutil.rmtree(clone_dir) run_command(["git", "clone", repo_url, str(clone_dir)]) # 3. 编译安装 print("🔨 编译安装...") build_dir = clone_dir / "build" build_dir.mkdir(exist_ok=True) os.chdir(build_dir) run_command(["cmake", ".."]) run_command(["make", "-j", str(os.cpu_count())]) run_command(["sudo", "make", "install"]) # 4. 配置用户组权限 print("🔑 配置用户组权限...") current_user = os.getlogin() run_command(["sudo", "usermod", "-aG", "input", current_user]) # 5. 创建 udev 规则 print("⚙️ 配置 udev 规则...") udev_rule = 'KERNEL=="uinput", GROUP="input", MODE="0660"' udev_path = "/etc/udev/rules.d/99-ydotool.rules" with open(udev_path, "w") as f: f.write(udev_rule) run_command(["sudo", "udevadm", "control", "--reload-rules"]) run_command(["sudo", "udevadm", "trigger"]) # 6. 启动守护进程 print("🚀 启动 ydotoold 服务...") try: run_command(["systemctl", "--user", "enable", "--now", "ydotoold"]) time.sleep(2) # 等待服务启动 status = run_command(["systemctl", "--user", "status", "ydotoold"], capture_output=True) if "active (running)" in status: print("✅ ydotoold 服务已成功启动") else: print("⚠️ 服务状态异常,请手动检查: systemctl --user status ydotoold") except Exception as e: print(f"❌ 服务启动失败: {str(e)}") print("请尝试手动启动: systemctl --user enable --now ydotoold") print("\n🎉 ydotool 安装完成!测试命令:") print(" ydotool --version") print(" ydotool key ctrl+alt+t") if __name__ == "__main__": if os.geteuid() != 0: print("⚠️ 部分操作需要 root 权限,可能需要输入密码") # 检查是否在 Wayland 环境下 if "WAYLAND_DISPLAY" not in os.environ: print("⚠️ 警告: 当前不在 Wayland 会话中") print("继续安装? (y/N) ", end="") if input().lower() != "y": sys.exit(0) install_ydotool() ``` ### 脚本功能说明 1. **依赖安装**: ```bash $ sudo apt install build-essential cmake libevdev-dev libwayland-dev ``` 2. **源码编译**: ```bash $ cmake .. && make -j$(nproc) && sudo make install ``` 3. **权限配置**: ```math \text{用户组权限: } \text{usermod -aG input \$USER} $$ \text{Udev 规则: } \text{KERNEL=="uinput", GROUP="input", MODE="0660"} $$ 4. **服务管理**: ```bash $ systemctl --user enable --now ydotoold ``` ### 使用说明 1. 将脚本保存为 `install_ydotool.py` 2. 添加执行权限: ```bash chmod +x install_ydotool.py ``` 3. 运行脚本: ```bash ./install_ydotool.py ``` ### 验证安装 ```bash $ ydotool --version $ ydotool key ctrl+alt+t # 测试打开终端 ``` ### 注意事项 1. 需要 `sudo` 权限执行部分操作 2. 安装后需重新登录使组权限生效 3. 在 GNOME 上可能需要额外配置: ```bash $ sudo apt install libgtk-3-dev # 解决 GTK 依赖问题 ``` 4. 对于 KDE Plasma 用户: ```bash $ export QT_QPA_PLATFORM=wayland # 确保 Qt 应用使用 Wayland ``` > **提示**:如果遇到权限问题,可尝试重启系统或运行 `newgrp input` 立即生效[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值