AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 763084
Accepted
cat pants
cat pants
Asked: 2023-12-05 09:02:01 +0800 CST2023-12-05 09:02:01 +0800 CST 2023-12-05 09:02:01 +0800 CST

有没有办法确定哪个进程正在重新启动服务器?

  • 772

我有一个 kvm 虚拟机,它似乎会随机重新启动。我在 syslog 中没有看到任何有关重新启动、关闭、错误、核心转储、恐慌等的信息。主机上的 libvirtd 日志中也没有错误,qemu 日志中也没有错误,主机上也没有任何错误。

似乎某个随机进程可能正在调用虚拟机内的重新启动系统调用?我能想到的就只有这些了...

我如何确定是什么原因造成的?操作系统是Debian。

linux
  • 2 2 个回答
  • 112 Views

2 个回答

  • Voted
  1. Best Answer
    LSerni
    2023-12-13T01:55:54+08:002023-12-13T01:55:54+08:00

    如果您不介意接触 C 代码,那么您可以编写一个简单的内核模块来拦截重新启动/关闭调用并通过printk().

    这个答案可能是一个好的开始。要了解谁在调用您修改后的处理程序,请查看这个。

    测试代码

    我尝试开发上面的提示,并提出了以下代码。

    在我自己的家庭系统(Ubuntu 22.04-LTS)上,它确实进行了编译并安装了内核模块,并且似乎可以使用一些符号:例如__do_sys_swapon:

    Dec 15 22:38:51 mintaka kernel: [82534.879652] __do_sys_swapon called by PID 5381 (swapon)
    

    但是 中似乎有几个类似重新启动的调用/proc/kallsyms,所以恐怕您需要几个 kprobe,或者需要相当多的试验和错误。如果我从提示符中__do_sys_reboot调用,似乎不会被记录。reboot

    #include <linux/module.h>
    #include <linux/printk.h>
    #include <linux/kprobes.h>
    
    MODULE_LICENSE("GPL");
    
    /**
     * Pre handler
     * @return int  unless you're a kprobe geek
     */
    static noinline int handler(struct kprobe *p, struct pt_regs *regs) {
        struct task_struct *task = current;
        printk(KERN_EMERG "%s called by PID %d (%s)\n", p->symbol_name, (int)task->pid, task->comm);
        return 0;
    }
    
    // Verify that the symbol name is present in /proc/kallsyms
    static struct kprobe kp = {
        .symbol_name    = "__do_sys_reboot",
        .pre_handler    = handler
    };
    /**
     * Module initialization
     *
     * @returns int
     */
    
    int init_module(void) {
        int ret;
        printk(KERN_INFO "loading whistlebooter\n");
        // register_kprobe ultimately returns e.g. arch_copy_kprobe() which succeeds with 0
        ret = register_kprobe(&kp);
        if (ret < 0) {
            if (-2 == ret) {
                printk(KERN_INFO "register_kprobe did not find the requested symbol\n");
            } else {
                printk(KERN_INFO "register_kprobe failed with code %d\n", ret);
            }
        } else {
            printk(KERN_INFO "kprobe registered at addr=%p for '%s'\n", kp.addr, kp.symbol_name);
        }
        return 0;
    }
    
    /**
     * @returns void
     */
    void cleanup_module(void) {
        printk(KERN_INFO "unloading whistlebooter\n");
        unregister_kprobe(&kp);
    }
    

    生成文件:

    # vim: tabstop=4 sw=4 noexpandtab
    obj-m += mymodule.o
    PWD := $(CURDIR)
    
    all:
            make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    
    clean:
            make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    

    要编译,只需运行“ make”。

    • 2
  2. Bog
    2023-12-08T21:44:59+08:002023-12-08T21:44:59+08:00

    log-files好吧,我首先会在以下位置检查我所知道的所有重要信息:

    • less /var/log/syslog
    • less /var/log/messages
    • less /var/log/kern.log
    • less /var/log/dmesg
    • -1

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve