5723 字
29 分钟
Linux基础问题 6

1.运行ping命令会产生一个进程,运行其他服务也会产生一个进程,那么在系统看来,这些进程有什么本质区别吗?#

  • 进程的共性(系统视角的统一管理)

    • 资源分配单位:每个进程都拥有独立的虚拟地址空间、文件描述符、信号处理等资源。
    • 调度实体:内核通过进程控制块(PCB/Task Struct)统一管理,参与CPU时间片轮转。
    • 生命周期:均通过fork()exec()等系统调用创建,通过exit()终止。
  • 进程的关键区别(本质差异)

    • 进程的创建来源:
      • 用户主动启动
      • 系统/服务守护进程(如nginxsshd
    • 进程的权限与身份:
      • 普通用户
      • root用户
    • 资源占用类型:
      • CPU密集型:如gcc编译进程会长期占用CPU
      • I/O密集型:如nginx服务进程大部分时间阻塞在网络I/O上
      • 短暂任务:ping是短期进程,而mysqld是长期运行的服务
    • 进程间的关系:
      • 会话(Session)与进程组
        • ping通常属于用户终端会话,退出终端会收到SIGHUP信号终止
        • 服务进程通常是独立会话领导者(例如systemd托管的服务)
      • 父子关系:服务进程可能通过fork()创建子进程池
    • 内核视角的特殊性:
      • 内核线程:
        • 无用户空间,直接运行在内核态,以[]标记(ps aux中可见)
        • 与用户进程(如ping)的地址空间、权限级别完全不同

2.线程与进程有什么区别#

进程是资源分配的基本单位,线程是执行的基本单位,多个线程可以共享进程的资源,但每个进程都有独立的资源空间

  1. 定义
    • 进程:是程序的一个执行实例,每个进程都有自己独立的内存空间和资源(如文件描述符)。
    • 线程:是进程内的一个执行单元,是程序执行的最小单位,多个线程共享进程的内存和资源。
  2. 资源占用
    • 进程:每个进程有独立的内存空间,切换进程时会涉及较高的开销。
    • 线程:线程之间共享进程的内存和资源,因此线程之间的切换开销较小。
  3. 执行
    • 进程:进程是独立的执行实体,彼此间通信需要使用进程间通信(IPC)机制。
    • 线程:线程共享进程资源,线程之间的通信通常比较轻便,可以通过共享内存或消息队列等方式。
  4. 开销
    • 进程:创建和销毁进程的开销较大,进程间的上下文切换较为耗时。
    • 线程:创建和销毁线程的开销较小,线程之间的上下文切换也相对较快。

3.多进程服务的结构#

  1. 主进程(Master Process)
    • 负责管理服务的生命周期。
    • 通常用来监听客户端请求,负责进程的创建和销毁。
    • 在某些情况下,主进程还会负责任务的分配,比如使用任务队列。
    • 也会处理一些全局共享资源(如配置、日志等)。
  2. 工作进程(Worker Process)
    • 负责实际的业务处理。
    • 每个工作进程独立处理一个请求,完成特定的任务。
    • 工作进程之间可以通过共享内存、消息队列或其他IPC(进程间通信)方式来协调。
    • 由于每个工作进程有独立的内存空间和资源,它们之间的崩溃不会直接影响其他进程。
  3. 进程间通信(IPC)
    • 由于进程之间是独立的,它们需要某种方式来共享数据或协调工作。
    • 常见的进程间通信方式包括:
      • 共享内存:多个进程共享同一块内存区域。
      • 消息队列:进程通过消息队列发送和接收消息。
      • 管道:一种进程间通过写入和读取数据流进行通信的机制。
      • 套接字(Socket):在网络上或本地进程间通过套接字进行通信。
  4. 负载均衡
    • 多进程架构通常会使用负载均衡策略来分配请求到不同的工作进程。
    • 负载均衡器可以是由主进程实现,或者是通过外部系统(如反向代理服务器)来平衡请求。
  5. 进程管理
    • 主进程负责监控工作进程的状态,确保工作进程在失败后能够重启。
    • 一些多进程框架或工具(如 supervisordsystemd)会帮助管理和监控进程。

4.什么是并行?什么是并发?它们的区别是什么?#

  1. 并发(Concurrency)

    并发是指系统能够在同一时间段内处理多个任务,但不一定是同时进行的。并发的核心在于任务的交替执行,即系统可以在多个任务之间切换,给人一种“同时”的感觉,但实际上它们是在共享资源的情况下交替运行。

    • 特点
      • 任务是交替执行的,可能是由单个处理器(核心)在不同时间片轮流处理多个任务。
      • 并发通常强调的是管理多个任务的执行,并不要求任务必须是同时进行的。
      • 并发可以通过多线程或多进程等方式实现,但在单核CPU上,任务的执行是轮流进行的。
  2. 并行(Parallelism)

    并行是指多个任务在同一时间(真正的同时)被多个处理器(或处理器核心)同时处理。并行的核心在于任务的同步执行,任务在多个处理单元上同时进行,能够加速处理。

    • 特点
      • 任务同时执行,在不同的处理器或核心上同时运行,通常需要多核CPU或多台计算机。
      • 并行要求任务是可以独立处理的,通常这些任务是通过分解成更小的子任务来并行执行的。
      • 并行的目标是加速任务的完成,通过同时执行多个任务,减少整体处理时间。
特点并发并行
定义任务交替执行,看起来是同时进行的任务真正同时执行,在多个处理器或核心上
执行方式多个任务共享处理器资源,任务在时间上交替多个任务在多个处理器核心上同时执行
系统需求单核心系统也可以实现需要多核处理器或多台计算机
重点任务调度和管理任务的同时执行
性能优化优化资源使用和任务调度通过多核同时执行来减少处理时间

5.Linux下的信号(Signal)是什么?如何发送信号给进程?给出具体命令#

在Linux中,信号(Signal)是操作系统用于通知进程发生某种事件的一种机制。信号是一种异步的事件通知,通常用于进程间通信或控制进程的执行。

信号有两种类型:

  1. 预定义信号:这些信号由系统定义,并具有固定的含义,例如 SIGKILLSIGTERM 等。
  2. 用户定义信号:用户可以定义并发送自定义的信号,通常是 SIGUSR1SIGUSR2

信号的作用包括:

  • 终止进程(如 SIGKILLSIGTERM
  • 暂停进程(如 SIGSTOP
  • 继续执行暂停的进程(如 SIGCONT
  • 启动某些特定操作(如 SIGUSR1SIGUSR2
信号数值描述
SIGINT2中断进程,通常由Ctrl+C触发
SIGTERM15请求进程终止,优雅退出
SIGKILL9强制杀死进程,进程无法捕获或忽略该信号
SIGSTOP19停止进程,进程会暂停执行(不可捕获或忽略)
SIGCONT18继续执行被暂停的进程
SIGUSR110用户定义的信号1
SIGUSR212用户定义的信号2
SIGSEGV11进程访问了非法内存地址(段错误)

例如:kill -9 1234表示强制杀死进程

6.常用的信号有9和15,它们有什么区别#

  • SIGTERM (信号15):是一个请求进程优雅终止的信号。它会告知进程需要终止,但进程可以捕获该信号并执行清理操作(如保存数据、关闭文件等),然后安全地退出。
  • SIGKILL (信号9):是一个强制杀死进程的信号。它会立即终止进程,进程无法捕获或阻止该信号,也无法执行任何清理操作(如保存文件、关闭数据库连接等)。

7.如何将服务放到后台运行?比如将ping命令放到后台运行#

  • 使用 &:将命令放到后台。
  • 使用 nohup:确保命令在关闭终端后继续运行。
  • 使用 disown:将后台任务从Shell会话中分离。
  • 使用 screentmux:创建持久会话,可以随时分离和恢复。

我习惯使用tmux,将ping命令放到后台运行步骤如下:

Terminal window
# 创建tmux会话
tmux new -s ping
# 在tmux会话中执行ping
ping 127.0.0.1
# 将会话挂到后台
Ctrl B然后按D

8.学习byobu,进行窗口上下拆分,左右拆分,并能将其切换到后台运行,唤起到前台#

PixPin_2025-08-21_22-39-23

9.如何设置一个脚本开机自动执行#

  1. 使用systemd创建服务

    Terminal window
    vim /etc/systemd/system/my_script.service

    在文件中输入以下内容,注释需要删掉:

    Terminal window
    [Unit]
    Description=My script at startup
    After=network.target
    [Service]
    ExecStart=/path/to/your/script.sh
    Restart=always
    User=your_user # 可选,指定用户执行脚本
    [Install]
    WantedBy=multi-user.target
    • After=network.target:确保脚本在网络服务启动之后执行(如果脚本需要网络)。
    • Restart=always:如果脚本崩溃,systemd 会自动重启它。
    • WantedBy=multi-user.target:这意味着该服务在进入多用户模式(即常规操作模式)时启动。

    重新加载配置:systemctl daemon-reload

    设置为开机自动执行:systemctl enable my_script.service

    启动服务:systemctl start my_script.service

  2. 使用crontab设置开机自启

    cron 是 Linux 中一个定时任务调度工具,它允许你设置在特定时间执行脚本,包括系统启动时

    • 编辑crontab文件:crontab -e
    • 添加一条启动时执行的任务:@reboot /path/to/your/script.sh@reboot 表示在系统启动时执行指定的脚本
    • 确认是否添加成功:crontab -l

10.如何设置定时任务,让脚本定时执行?并解释’* * * * *‘这五个星号各自的含义#

  • 设置定时任务:
    • 编辑crontab文件:crontab -e
    • 添加一条定时执行的任务:* * * * * /path/to/your/script.sh,这五个星号代表定时任务的时间设置
    • 确认是否添加成功:crontab -l
  • 五个星号的含义:
    • 第一位(分钟):表示任务在每小时的哪一分钟执行,范围是 0-59
      • 例如:5 表示每小时的第 5 分钟执行任务,*/5 表示每 5 分钟执行一次。
    • 第二位(小时):表示任务在每天的哪个小时执行,范围是 0-23(0 表示午夜 12 点,23 表示 11 点 PM)。
      • 例如:3 表示每天的 3 点执行任务,*/2 表示每 2 小时执行一次。
    • 第三位(日):表示任务在每月的哪一天执行,范围是 1-31
      • 例如:15 表示每个月的 15 日执行任务,*/2 表示每 2 天执行一次。
    • 第四位(月):表示任务在每年的哪个月执行,范围是 1-12(1 表示 1 月,12 表示 12 月)。
      • 例如:6 表示每年的 6 月执行任务,*/3 表示每 3 个月执行一次。
    • 第五位(星期几):表示任务在每周的哪一天执行,范围是 0-7(0 和 7 都表示星期天,1 表示星期一,以此类推)。
      • 例如:1 表示每周的星期一执行任务,*/2 表示每 2 天执行一次。
  • 例如:
    • 每分钟执行一次:* * * * * /path/to/your/script.sh
    • 每天凌晨1点执行:0 1 * * * /path/to/your/script.sh
    • 每两小时执行一次0 */2 * * * /path/to/your/script.sh
    • 每周一执行:0 0 * * 1 /path/to/your/script.sh
    • 每小时的第15分钟执行:15 * * * * /path/to/your/script.sh

11.什么是环境变量?PATH这个环境变量的作用是什么?#

1.什么是环境变量#

环境变量是操作系统中用于存储系统级或者应用级配置的变量,它们对系统中运行的程序和脚本起着重要作用

2.环境变量的类型#

  1. 系统环境变量:这些环境变量在整个系统范围内生效,通常由操作系统在启动时定义,影响所有用户和进程。例如:PATHHOMEUSERLANG 等。
  2. 用户环境变量:这些环境变量仅在特定用户的会话中生效。用户可以自己定义这些变量,通常存储在如 .bashrc.bash_profile.zshrc 等文件中。
  3. 局部环境变量:这些变量只在特定进程或脚本的执行期间生效,通常通过命令行或脚本临时设置。

3.PATH环境变量的作用#

PATH 告诉操作系统在什么目录下去查找命令和程序

例如PATH包含以下路径:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin,那么当输入 ls 命令时,系统会按照以下顺序查找 ls 可执行文件:

  1. 首先在 /usr/local/bin 目录下查找 ls
  2. 如果没找到,再在 /usr/bin 目录下查找。
  3. 接着在 /bin 目录下查找。
  4. 继续在 /usr/sbin/sbin 目录下查找。
  5. 如果 ls 文件在这些目录中都找不到,系统会显示“ls not found”错误

12.如何在PATH中添加内容,并使其永久生效?#

临时修改 PATH(仅对当前会话有效)

Terminal window
export PATH=$PATH:/new/directory
  • 这个命令将 /new/directory 添加到当前 PATH 的末尾

永久修改 PATH(对所有会话有效)

修改用户的 shell 配置文件(如 ~/.bashrc~/.bash_profile~/.zshrc 等),并在文件末尾添加类似以下的行:

Terminal window
export PATH=$PATH:/new/directory

后通过运行 source ~/.bashrc(或其他配置文件)使更改生效。

13.crontab中的环境变量与平常的环境变量有什么不同?#

  1. 作用范围不同
    • 平常的环境变量:这些环境变量通常在用户的会话中有效,适用于当前的用户登录终端或图形界面程序
    • crontab 中的环境变量crontab 文件中的环境变量仅对定时任务(即 cron 作业)有效。它们不会影响到其他终端或会话中的环境。cron 作业是由 cron 守护进程执行的,这个进程在执行任务时使用的是最基础的环境变量,因此你需要在 crontab 中明确设置一些关键环境变量,如 PATHHOMEUSER 等,确保脚本正确执行。
  2. 加载方式不同
    • 平常的环境变量:这些环境变量通常由系统或用户的 shell 配置文件加载,例如:
      • /etc/profile/etc/bash.bashrc(系统范围)
      • ~/.bashrc~/.bash_profile(用户范围) 这些文件会在用户登录或启动新的 shell 会话时被加载,包含了很多系统或应用的配置。
    • crontab 中的环境变量cron 任务运行时并不自动加载用户的 shell 配置文件(例如 .bashrc.bash_profile 等)。这意味着任何在这些文件中定义的环境变量,cron 不会默认加载。你必须手动在 crontab 文件中指定这些变量。
  3. 可用的默认环境变量不同
    • 平常的环境变量:正常登录时,操作系统会设置许多常用的环境变量,例如 PATHHOMEUSERSHELLLANG 等,供用户和程序使用。
    • crontab 中的环境变量cron 作业通常会有一个非常简化的环境(最小化),这意味着许多标准的环境变量(比如 PATH)可能不存在或不完整。因此,通常需要手动在 crontab 文件中指定这些变量,以确保任务能够正常执行。例如,PATH 可能只包含很少的系统路径,这会导致一些常见的命令无法找到。

14.Linux系统中什么能够与硬件直接交互?#

  1. 内核(Kernel)

    Linux 内核是操作系统的核心,负责管理硬件资源与软件之间的交互。

    内核通过设备驱动程序(device drivers)与硬件进行交互。每个硬件设备通常都有一个专门的驱动程序,它们位于内核空间,并且能够将硬件操作转化为软件操作。

  2. 设备驱动(Device Drivers)

    设备驱动是内核中与硬件设备进行通信的程序模块。它们负责管理硬件设备的具体细节

    • 磁盘驱动:例如 ext4NTFS 驱动程序,用于与存储设备交互。
    • 图形驱动:如 NVIDIA、AMD 或开源的 nouveau,用于图形卡的操作。
    • 网络驱动:如 eth0wlan0 等,用于与网络接口设备(如网卡、Wi-Fi)通信。
    • USB 驱动:负责管理与 USB 设备(如打印机、摄像头、闪存)之间的交互。
  3. 系统调用(System Calls)

    系统调用是应用程序与内核之间的接口。通过系统调用,用户空间的程序能够请求内核进行硬件访问。这些调用可能包括:

    • 读/写文件:访问磁盘上的文件。
    • I/O 操作:与硬件进行交互,通常通过文件描述符实现。
    • 网络通信:通过套接字与网络接口卡交互。

    比如,在访问硬盘或其他外设时,用户程序会通过系统调用(如 read()write())将操作请求传递给内核,然后由内核驱动程序与硬件设备交互。

15.应用程序是如何操作硬件的#

在 Linux 操作系统中,应用程序通过一系列中介层来操作硬件。这些中介层包括 系统调用设备驱动程序内核

  1. 应用程序与内核交互

    应用程序无法直接操作硬件,因为它们运行在 用户空间,而硬件操作需要运行在 内核空间。为了解决这个问题,应用程序通过 系统调用 来请求内核执行特定的硬件操作

  2. 内核处理请求

    在接收到系统调用后,内核会通过相应的 设备驱动程序 来与硬件进行交互

  3. 设备驱动程序(Device Drivers)

    设备驱动程序是内核的一部分,它充当了应用程序和硬件之间的桥梁。设备驱动程序直接与硬件通信,并将硬件的低级操作封装成更高层次的接口,供内核或应用程序使用

  4. 硬件访问

    设备驱动程序通过特定的接口(如 I/O 端口内存映射 I/O)与硬件进行通信

  5. 硬件设备交互

    设备驱动程序将内核或应用程序的请求翻译成硬件能够理解的信

16.什么是驱动?内核依赖驱动还是驱动依赖内核?#

  1. 什么是驱动(Device Driver)
    • 驱动(Device Driver)是操作系统中与硬件设备进行通信的程序模块。它充当了硬件与操作系统之间的桥梁,允许操作系统及其应用程序通过抽象的接口访问和控制硬件设备。
  2. 内核依赖驱动还是驱动依赖内核
    • 操作系统内核与驱动程序是相互依赖、相互配合的关系。
    • 内核为驱动程序提供运行环境,驱动程序为内核提供对硬件设备的访问能力。
    • 两者共同构成了操作系统对硬件设备的管理和控制体系。

17.不同的Linux系统,使用的内核有什么区别?这些内核由谁进行维护?#

不同的 Linux 发行版可能会使用不同版本的内核

内核的开发由 Linus Torvalds 主持,全球的开发者和社区进行贡献。以下是内核的主要维护者和组织:

  • Linus Torvalds:Linux 内核的创始人和主要维护者,负责主线内核的开发和发布。
  • Linux 基金会:Linux 基金会通过其支持的项目和社区为内核开发提供资源和协作平台,负责长期支持(LTS)内核的维护。
  • 内核开发者社区:全球的开发者贡献补丁和新特性。内核的更新周期通常为 每个季度发布一个新版本,而每个版本的支持期大约为 6 周左右,除 LTS 内核外,后者的支持期为 6 年。
  • 发行版开发者:Linux 发行版(如 Ubuntu、Red Hat 等)会对主线内核进行补丁和定制,提供长期的安全更新和维护。每个发行版会为其用户维护特定的内核版本。

18.软件的版本号一般分为几位?#

软件的版本号通常由 三位四位组成,表示软件的不同更新级别

  • 三位版本号:主版本号.次版本号.修订号
    • 主版本号(Major version):通常在软件发生重大变化、架构变化、功能大幅度改动或不兼容更新时增加
    • 次版本号的更新通常是向后兼容的
    • 修订号(Patch version / Bugfix version):修复小的 bug、漏洞或进行性能优化时增加,通常不影响功能
  • 四位版本号:主版本号.次版本号.修订号.构建号
    • 构建号(Build number):通常用于标识软件的具体构建或版本号,尤其在自动化构建系统中,构建号用于跟踪每次构建的不同版本。这种编号系统对于开发者和测试人员来说非常有用,可以精确标识软件版本

19.将ping 127.0.0.1制作为system服务,并设置为开机启动#

创建.service文件

Terminal window
vim /etc/systemd/system/ping-localhost.service

将以下内容写入该文件

Terminal window
[Unit]
Description=Continuous ping to localhost (127.0.0.1)
After=network.target
[Service]
Type=simple
ExecStart=/bin/ping 127.0.0.1
Restart=always
RestartSec=3
User=nobody
[Install]
WantedBy=multi-user.target
  • Description:服务描述。
  • After=network.target:确保网络就绪后启动。
  • Type=simple:服务进程为主进程(非派生型)。
  • ExecStart:实际执行的命令(这里是ping 127.0.0.1)。
  • Restart=always:进程退出时自动重启。
  • RestartSec=3:重启间隔(秒)。
  • User=nobody:以低权限用户运行(增强安全性)

重载systemd配置

Terminal window
systemctl daemon-reload

启动服务并验证

Terminal window
systemctl start ping-localhost
systemctl status ping-localhost

设置开机自启

Terminal window
systemctl enable ping-localhost

20.如何启动、停止、重启、设置开机启动/取消开机启动system服务#

Terminal window
# 启动
systemctl start <服务名>.service
# 停止
systemctl stop <服务名>.service
# 重启
systemctl restart <服务名>.service
# 开机自动运行system服务
systemctl enable <服务名>.service
# 取消开机自动运行system服务
systemctl disable <服务名>.service

21.如何查看system服务的日志?以Ubuntu24和Alma最新版为例#

查看指定服务的日志

Terminal window
journalctl -u <服务名>.service
参数作用
-f实时跟踪日志(类似 tail -f
-n <行数>显示最近 N 行(如 -n 50
--since "YYYY-MM-DD HH:MM:SS"查看指定时间后的日志
--until "YYYY-MM-DD HH:MM:SS"查看指定时间前的日志
-p <优先级>按日志级别过滤(如 -p err 只看错误)

查看所有服务的日志

Terminal window
journalctl
Linux基础问题 6
https://fuwari.cbba.top/posts/佚名运维免费训练营-第6天/
作者
Chen_Feng
发布于
2025-08-21
许可协议
CC BY-NC-SA 4.0