启动后进程启动

Jak*_*ake 2 process

我知道以下是进程在 Linux 中启动的方式

  • 来自 init.d(或类似的)
  • 从外壳(由用户)
  • 由正在运行的本机守护程序分叉

是否有可能在 Linux 上启动一个进程,并且它不属于上述类别?例如,是否可以在用户不知情的情况下启动进程?

Bas*_*tch 8

在 Linux 上,几乎所有进程(包括服务器和守护程序)都以fork(2)(有时在标准 C 库中使用clone(2) 实现)启动,通常后跟execve(2)系统调用。该守护进程(3)库函数使用这些(和一些其他几个人)系统调用(中列出的系统调用(2) ....)

唯一的例外是一些由内核神奇地启动的进程。这些包括:

  • init(通常/sbin/init,现在可以被systemd,但您可以引导内核并init=/bin/bash通过 GRUB传递给它),它在内核初始化时启动。

  • 一些非常少的程序由内核神奇地启动(当一些外部事件发生时),例如有时modprobehotplug等......

init存在于 1980 年代的 Unixes(例如 SunOS3)。AFAIK,自动启动hotplug的类似进程是最近添加的 Linux(可能是 Linux 3,或至少 2.6,另见udev

大多数程序和进程(包括login, bash, getty, cron, atd, mysqld)都是init with fork& 的后代execve 您基本上可以忽略异常(例如hotplug),并且您可以拥有一个每个进程都是其后代的 Linux 系统init(Linux 1.x 就是这种情况)。 x 内核在上个世纪)。使用pstree(1) 查看进程树。

阅读关于Linux 启动过程从 PowerUp 到 Bash Prompt 的 wikipage(可能有点过时,但大部分仍然是正确的)。

setuid是一种与权限相关的巧妙机制(另请参阅setreuid(2)credentials(7)capabilities(7)namespaces(7))。

我建议首先阅读Advanced Linux Programming。在那本书之后出现了一些功能或系统调用(例如signalfd(2)inotify(7)epoll(7) ....)。