分类 linux相关 下的文章

出现 (initramfs) 提示符,说明内核已经成功加载并启动,但无法找到或挂载根文件系统(Root File System)。这通常是因为虚拟磁盘的设备名称发生改变(例如原先是 sda,现在在 KVM 中变成了 vda),或者引导参数中的 UUID 与实际不符。可以通过以下步骤在当前界面排查并定位问题:1.1. 检查内核是否识别到虚拟磁盘:查看块设备。在 (initramfs) 提示符下输入以下命令,查看系统当前挂载了哪些磁盘:Plaintextcat /proc/partitions
验证成功: 终端会列出设备列表,检查里面是否有 vda、sda 及其对应的主分区(如 vda1、sda1)。2.2. 获取正确的分区及文件系统信息:检查分区 UUID。输入以下命令查看磁盘的详细格式和 UUID:Plaintextblkid
验证成功: 能够看到类似于 /dev/vda1: UUID="..." BLOCK_SIZE="..." TYPE="ext4" 的输出信息。

既然 blkid 已经能够识别到 vda 及其分区,说明内核和驱动已经正常工作。之所以卡在 (initramfs) 界面,通常是因为系统找不到对应的根分区 UUID,或者文件系统由于异常关机导致损坏需要修复。1.1. 退出 initramfs 查看真实报错:获取崩溃日志。在 (initramfs) 提示符下输入:Plaintextexit
验证成功: 屏幕会向上滚动并打印出导致系统无法正常挂载根目录的具体错误日志(例如提示某个 UUID 不存在、超时或文件系统损坏)。2.2. 执行文件系统检查与修复:修复文件系统。如果刚才的报错提示文件系统损坏或未正常卸载,请对你的根分区(假设 blkid 显示根分区为 /dev/vda1,请按实际情况调整)执行强制修复:Plaintextfsck -y /dev/vda1
验证成功: fsck 运行结束并提示文件系统已清理修复(Clean / blocks fixed)。

将r730上的kvm虚拟机迁移到r710服务器上避坑:

一号坑:

Machine Type(机器类型)不兼容:
原系统的机器类型可能是特定定制的(例如 pc-i440fx-rhel7.x.x)。Ubuntu 24.04 的 QEMU 无法识别这种类型。

修改方法: 找到 标签下的 ,将其修改为 Ubuntu 支持的通用类型,例如默认的 pc 或者较新的 q35。我的改为了:pc-i440fx-2.12

降低 CPU 模型以适配老旧的 R710
R710 的 CPU 架构较老(Westmere 架构),需要将 CPU 模型改为兼容模式(如 Westmere 或 Penryn),删掉那些新 CPU 特性要求:

XML

<model fallback='allow'>Westmere</model>

二号坑

Emulator(模拟器)路径变更:
不同系统的 QEMU 执行文件路径可能不同(例如某些系统是 /usr/libexec/qemu-kvm)。

修改方法: 确保 标签的值为 Ubuntu 的正确路径,通常是 /usr/bin/qemu-system-x86_64。
修正虚拟磁盘路径
找到 这一段,将 修正为你当前在 Ubuntu 上存放该 .qcow2 文件的真实绝对路径(例如你之前提到的 /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2):

XML

<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2'/>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

三号坑

Ubuntu 特有的 AppArmor 安全策略
这是迁移到 Ubuntu 时最容易踩坑的地方。Ubuntu 默认使用 AppArmor 保护系统。如果你的虚拟机磁盘镜像(如 .qcow2)放在了非默认路径(默认是 /var/lib/libvirt/images/,如果你挂载到了自定义的数据盘如 /data/vms/),AppArmor 会直接拦截 QEMU 的读取请求,日志里会显示 Permission denied。

排查方式: 运行 dmesg | grep -i apparmor | grep DENIED,看看是否有针对你虚拟机镜像路径的拦截记录。

解决方式: 你需要修改 AppArmor 的 libvirt 配置,将你的自定义目录加入白名单。编辑 /etc/apparmor.d/local/usr.lib.libvirt.virt-aa-helper,添加你的镜像路径(例如加上一行 /data/vms/** rwk,),然后重启 AppArmor 服务。
sudo systemctl reload apparmor

四号坑

镜像文件权限与属主
在 Ubuntu 24.04 上,QEMU 进程通常以 libvirt-qemu 用户(属于 kvm 用户组)运行。
迁移过来的镜像文件可能还保留着 root 或原系统特定用户的权限,导致 QEMU 无法读取。

解决方式: 手动将镜像文件的属主改过来:
保留在家目录,修改目录穿透权限
如果你必须把镜像放在这个位置(例如这块硬盘空间很大),你需要逐级赋予外来用户“进入”目录的权限(即执行权限 x),并修改镜像文件的属主。

逐级开放目录的进入权限(o+x):
注意,这会让系统上其他用户也能通过已知路径访问你的家目录文件,请确保安全。

Bash
chmod o+x /home/qianlong
chmod o+x /home/qianlong/kvm
chmod o+x /home/qianlong/kvm/vdisks
将镜像文件的属主改为 QEMU 进程账户:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2

五号坑

网络接口 (Bridge/NAT) 缺失
检查 XML 中的 部分。
如果你的虚拟机原来使用的是桥接网络(如 并指定了 br0),那么在新的 Ubuntu 24.04 宿主机上,必须提前配置好同名的网桥。如果宿主机的网桥不存在,虚拟机在初始化网卡设备时就会直接报错退出。

六号坑

在 KVM 虚拟化中,经常会使用模板克隆来节省空间。你的 kali2026.1kvm8901.qcow2 并不是一个包含完整系统数据的独立镜像,而是一个增量镜像(Differential Image)。

它在底层强烈依赖于一个基础模板文件:/home/disk/nvme1/kvm/vdisks/kali2026.1_template.raw。
在迁移到这台新的宿主机时,底层的 QEMU 进程按照这个写死的旧路径去寻找基础模板,但没有找到。这通常是因为该文件没有被拷贝过来,或者新服务器的目录结构不同(例如缺少 nvme1 这个挂载点)。

解决方法
你需要找到那个基础模板文件,并修正 .qcow2 文件中的路径指向。

步骤 1:定位基础模板文件
请先在当前的 Ubuntu 系统中找到 kali2026.1_template.raw 文件。假设你已经将它和现在的 .qcow2 文件放在了同一个目录下,即 /home/qianlong/kvm/vdisks/。

步骤 2:重置基础镜像路径(Rebase)
使用 qemu-img rebase 命令来修改 .qcow2 内部记录的基础镜像路径:

Bash

请将 -b 后面的路径替换为模板文件在你当前系统上的真实绝对路径

qemu-img rebase -u -b /home/qianlong/kvm/vdisks/kali2026.1_template.raw -F raw /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2
提示:-u 参数表示不安全模式(Unsafe mode),它的作用是强行改写路径指针而不去校验旧路径的数据,由于你的旧路径已经不存在了,必须加上这个参数。

步骤 3:验证路径修改
运行以下命令检查镜像信息:

Bash
qemu-img info /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2
在输出的内容中,确认 backing file 这一项已经成功变更为你刚刚设置的新路径。

步骤 4:赋予基础镜像权限
因为虚拟机启动时不仅需要读取 .qcow2,还需要读取底层的 .raw 模板。请确保 libvirt-qemu 账户对基础模板文件同样具有权限:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1_template.raw
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2

七号坑:既然修改完配置后,虚拟机依然提示 No bootable device(找不到引导设备)

既然修改完配置后,虚拟机依然提示 No bootable device(找不到引导设备),说明虚拟机的虚拟硬盘(即那条增量链)虽然能被 QEMU 打开,但系统在里面依然找不到有效的引导扇区(MBR/GPT)或内核。

1、可以通过以下步骤排查磁盘镜像的实际状态:1.1. 查看 qcow2 镜像状态:检查镜像基本信息。在宿主机终端运行以下命令,检查该虚拟磁盘的大小和格式:Bashqemu-img info /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2
验证成功: 终端正常输出镜像的虚拟大小、实际占用空间及文件格式。

2.检查底层模板文件自分区表:验证 raw 模板完整性。运行以下命令直接检查 .raw 模板的分区结构,看看它在 R710 上是否能被正常读取:Bashsudo fdisk -l /home/qianlong/kvm/vdisks/kali2026.1_template.raw
验证成功: 终端能够正常打印出类似 Linux 分区(如 /dev/loopXp1 或分区表详情)即说明模板完好;若报错则说明该文件在跨服务器拷贝时损坏或不完整。

3.检查模板镜像元数据:核对虚拟大小。运行以下命令查看 .raw 文件的基本属性:Bashqemu-img info /home/qianlong/kvm/vdisks/kali2026.1_template.raw

问题的原因已经找到了:从 qemu-img info 的输出可以看出,这个文件的后缀虽然叫 .raw,但它实际的文件格式是 qcow2。

因为 fdisk 只能直接读取纯 Raw 格式的绝对物理偏移,无法解析 qcow2 内部的封装结构,所以刚才直接用 fdisk 无法正确读取分区。

4、 修正文件后缀名避免误导:规范化命名(可选)。为了避免以后混淆,建议将模板文件的后缀名从 .raw 改为 .qcow2:Bashmv /home/qianlong/kvm/vdisks/kali2026.1_template.raw /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2
(注意:改名后,需要同步修改子镜像 kali2026.1kvm8901.qcow2 内部的 backing file 指向路径,或者重新指定底层模板)。验证成功: 再次运行 qemu-img info 确认基础链条指向正常。

5、重新更新重置基础镜像路径(Rebase)
qemu-img rebase -u -b /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2 -F qcow2 /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2

6、赋予基础镜像权限
因为虚拟机启动时不仅需要读取 .qcow2,还需要读取底层的 .raw 模板。请确保 libvirt-qemu 账户对基础模板文件同样具有权限:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2
重新启动虚拟机,可以启动了

具体我的操作修改项如下:

1、virsh edit kali2026.1kvm8902
修改内容如下:

<domain type='kvm'>
  <name>kali2026.1kvm8901</name>
  <uuid>921fd605-7601-4052-87bd-7ada46849e74</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <os>
    **<type arch='x86_64' machine='pc-i440fx-2.12'>hvm</type>**
    <boot dev='hd'/>
    <boot dev='cdrom'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    **<model fallback='allow'>Westmere</model>**
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    **<emulator>/usr/bin/qemu-system-x86_64</emulator>**
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      **<source file='/home/qianlong/kvm/vdisks/kali2026.1kvm8901.qcow2'/>**
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
     <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' >
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:28:45:98'/>
      **<source bridge='br0'/>**
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='8901' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <audio id='1' type='none'/>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primar>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

2、使kvm可以访问/home目录
编辑 /etc/apparmor.d/local/usr.lib.libvirt.virt-aa-helper,添加你的镜像路径
加上一行
/home/qianlong/kvm/vdisks/** rwk,
然后重启 AppArmor 服务。
sudo systemctl reload apparmor

3、修改镜像文件权限与属主
chmod o+x /home/qianlong
chmod o+x /home/qianlong/kvm
chmod o+x /home/qianlong/kvm/vdisks
将镜像文件的属主改为 QEMU 进程账户:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8902.qcow2

4、重置基础镜像路径(Rebase)
使用 qemu-img rebase 命令来修改 .qcow2 内部记录的基础镜像路径
qemu-img rebase -u -b /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2 -F qcow2 /home/qianlong/kvm/vdisks/kali2026.1kvm8902.qcow2

5、赋予基础镜像权限
因为虚拟机启动时不仅需要读取 .qcow2,还需要读取底层的 .raw 模板。请确保 libvirt-qemu 账户对基础模板文件同样具有权限:

Bash
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1_template.qcow2
sudo chown libvirt-qemu:kvm /home/qianlong/kvm/vdisks/kali2026.1kvm8902.qcow2

6、重启kvm虚拟机
virsh start kali2026.1kvm8902

在 CentOS 7 中,使用 Systemd Timer 代替 Crontab 是更现代、可控性更高的方案。相较于 Cron,Systemd Timer 具备以下核心优势:独立且统一的日志收集:所有输出和报错(stdout/stderr)自动由 journalctl 收集,无需手动做 >> log.txt 日志重定向。精准的环境控制:可以直接在 Service 中定义工作目录(WorkingDirectory)、运行用户(User)和特定环境变量。错过补执行机制(Persistent):如果服务器在原定触发时间处于关机状态,开机后可以自动补执行错过的任务。Systemd 采用双单元机制:需要建立一个 .service 文件定义“做什么”,以及一个 .timer 文件定义“何时触发”。搭建与配置流程1.1. 创建 Service 服务单元 (.service):定义要执行的 Python 脚本。在 /etc/systemd/system/ 目录下创建一个名为 my-python-task.service 的文件:Ini, TOML# /etc/systemd/system/my-python-task.service
[Unit]
Description=My Scheduled Python Script Service
After=network.target

[Service]
Type=oneshot
User=root
WorkingDirectory=/home/user/project
ExecStart=/usr/bin/python3 /home/user/project/myscript.py

如果使用了 Python 虚拟环境,直接将 ExecStart 指向虚拟环境内的解释器:

ExecStart=/home/user/venv/bin/python /home/user/project/myscript.py

[Install]
WantedBy=multi-user.target
2.2. 创建 Timer 定时单元 (.timer):定义触发的时间规则。在同一目录下创建前缀同名的 my-python-task.timer 文件:Ini, TOML# /etc/systemd/system/my-python-task.timer
[Unit]
Description=Run My Python Task Periodically

[Timer]

1. 设定触发时间规则(例如:每天凌晨 02:00 运行)

OnCalendar=--* 02:00:00

2. 若关机错过了执行时间,开机后是否立即补执行一次

Persistent=true

显式绑定要触发的 service(如果文件名同名,此项可省略)

Unit=my-python-task.service

[Install]
WantedBy=timers.target
3.3. 加载并激活 Timer:重新加载 Systemd 配置并启动定时器。文件建立完毕后,需要刷新 Systemd 守护进程并启用该 Timer:Bash# 重新加载 Systemd 配置文件
systemctl daemon-reload

启动 Timer 并设置开机自启(注意是启动 .timer 而非 .service)

systemctl enable --now my-python-task.timer
4.4. 检查运行状态与手动测试:验证定时器与服务是否生效。可以通过以下命令验证 Timer 状态,并手动测试脚本运行是否正常:Bash# 1. 查看当前系统中所有活着的 Timer 列表及其下次触发时间
systemctl list-timers

2. 查看 Timer 自身的激活状态

systemctl status my-python-task.timer

3. 手动触发一次 Service(用于测试脚本本身能否正常正常跑通)

systemctl start my-python-task.service
常用 OnCalendar 时间语法Systemd 提供了非常人性化的时间表达式:需求OnCalendar 写法示例每 5 分钟OnCalendar=:0/5每小时整点OnCalendar=hourly 或 -- :00:00每天凌晨 2 点OnCalendar=daily 或 -- 02:00:00每周一上午 8:30OnCalendar=Mon -- 08:30:00每月 1 号 00:00OnCalendar=monthly 或 -*-01 00:00:00日志查看与故障排查Systemd 自动通过 journald 收集该任务的所有日志(包括 Python 脚本里的 print() 输出与异常抛出):Bash# 查看该 Python 服务的完整历史运行日志
journalctl -u my-python-task.service

实时追踪该服务的最新日志(类似 tail -f)

journalctl -u my-python-task.service -f -n 50

查看最近一次失败日志

journalctl -u my-python-task.service -p err

在 CentOS 7 中,最标准且稳定的方式是使用系统自带的 Cron (crontab) 服务。由于 Cron 运行时的环境变量与普通终端不同,配置时的关键在于:必须全部使用绝对路径,并建议重定向日志输出以便排查错误。操作步骤1.确认 Cron 服务已启动:耗时约 10 秒。在终端检查 crond 服务状态,确保其正常运行并开机自启:Bash# 查看服务状态
systemctl status crond

如果未运行,启动服务并设置开机自启

systemctl start crond
systemctl enable crond
2.获取 Python 和脚本的绝对路径:避免因环境变量导致找不到命令。Cron 默认只在极简的环境变量中运行,直接写 python 或相对路径容易报错。请在终端查询绝对路径:Bash# 查找 Python 绝对路径(例如:/usr/bin/python3 或虚拟环境中的路径)
which python3

进入脚本所在目录获取完整路径

cd /path/to/your_project
pwd
假设你的 Python 路径为 /usr/bin/python3,脚本绝对路径为 /home/user/myscript.py。3.编辑 Cron 任务配置:打开当前用户的 crontab 配置文件。运行以下命令进入编辑界面(默认使用 vi/vim 编译器):Bashcrontab -e
4.添加定时任务规则并保存:配置执行周期与重定向日志。按 i 键进入插入模式,在文件末尾添加你的定时任务规则(强烈建议添加日志输出):Bash# 语法格式:

分 时 日 月 周 /Python绝对路径 /脚本绝对路径 >> /日志绝对路径 2>&1

示例:每天凌晨 2:00 执行 Python 脚本,并将运行日志存入 cron_run.log

0 2 * /usr/bin/python3 /home/user/myscript.py >> /home/user/cron_run.log 2>&1
编辑完成后,按 Esc 退出插入模式,输入 :wq 保存并退出。常用时间配置示例列表Cron 的时间表达式由 5 个占位符组成:分 时 日 月 周。表达式执行频率/5 每 5 分钟执行一次0 每小时的整点执行一次0 2 每天凌晨 2:00 执行30 8 1每周一早上 8:30 执行0 0 1 每月 1 号 midnight (00:00) 执行避坑指南(关键细节)使用了 Python 虚拟环境 (venv / conda)如果你使用了虚拟环境,不需要在 Cron 里写 source activate,直接将路径指向虚拟环境中的 Python 解释器即可:Bash0 2 * /home/user/venv/bin/python /home/user/myscript.py >> /home/user/cron.log 2>&1
脚本内部涉及相对文件路径如果 Python 脚本内部有 open('data.json') 这类读取相对路径的代码,Cron 执行时可能会找不到文件。建议在 Python 脚本开头加上:Pythonimport os
import sys

强制将工作目录切换为当前脚本所在的目录

os.chdir(os.path.dirname(os.path.abspath(__file__)))
如何查看任务是否被触发与排查错误查看系统的 Cron 执行日志:tail -f /var/log/cron查看脚本自己的输出/报错日志:cat /home/user/cron_run.log查看当前用户的所有定时任务:crontab -l

分两大系统:Windows(你本机) 和 Linux(你的OpenClaw服务器),分开命令,你对照自己环境执行。

一、如果你是 Windows(脚本注册成 Windows 服务)

两种常见方式:sc 创建服务 / nssm 注册脚本服务

方式1:列出全部系统服务(图形界面)

1. Win+R 输入: services.msc  回车
滚动查找,但是名字多,不方便搜索。

方式2:PowerShell(管理员打开,推荐!精准检索)

  1. 列出所有服务名称+显示名称

powershell

Get-Service | Select-Object Name,DisplayName | Sort-Object DisplayName
 

  1. 关键词搜索(比如脚本包含 script、run、task 等关键词,改成你的关键词)

powershell

Get-Service | Where-Object {$_.DisplayName -match "script"}
 

找到服务名之后操作

假设服务名称: MyScriptService 

1. 停止服务

powershell

Stop-Service -Name MyScriptService
 

2. 删除/卸载服务(管理员权限)

powershell

sc delete MyScriptService
 

重要:NSSM注册的脚本服务,也是用这条  sc delete  删除。

二、如果你是 Linux 系统(大概率你的 OpenClaw 服务器)

Linux 现在绝大多数是 systemd(主流:Ubuntu、Debian、CentOS、Rocky)

1、查看所有 systemd 服务

bash

systemctl list-unit-files --type=service
 

2、只查看正在运行的服务

bash

systemctl list-units --type=service --state=running
 

3、模糊搜索(最强推荐!搜索关键字,替换关键词)

bash

systemctl list-unit-files --type=service | grep script
 

找到服务名(例如  mytask.service )完整卸载流程

bash

1.停止服务

systemctl stop mytask.service

2.设置开机不启动

systemctl disable mytask.service

3.删除服务文件(真正卸载)

rm -f /etc/systemd/system/mytask.service

4.重载systemd配置

systemctl daemon-reload
 

补充:老式 SysVinit(极少)

bash

service --status-all
 

三、关键区分一个坑

1. systemd 服务文件路径一般在: /etc/systemd/system/ 
你自己手动写脚本注册的服务基本都在这里,可以直接ls浏览全部文件:

bash

ls /etc/systemd/system/*.service
 

直接看文件名,肉眼寻找你自建的脚本服务,找不到再用上面检索命令。

快速自查建议(推荐操作顺序)

Windows:

管理员PowerShell执行

powershell

Get-Service | Select Name,DisplayName > services-list.txt
 

会在当前目录生成文本文件,打开慢慢搜索关键词。

Linux服务器:

直接执行

bash

ls /etc/systemd/system/*.service
 

浏览所有自建服务文件,一眼找到你当年创建的service。

额外提醒

如果你当时只是写定时任务(crontab)不是注册系统服务,上面命令看不到!
Linux查看定时任务:

bash

crontab -l
 

你可以告诉我:系统是 Windows 还是 Linux,我给你一条直接复制就能检索的完整命令。