学习目标

  • 理解本节涉及的核心主题:Linux 进程管理、总结、Linux 用户与组管理、创建与删除用户与组。
  • 掌握重点命令或工具:useraddusermoduserdelgroupaddgroupdelsudo
  • 能够结合示例完成常见操作,并理解关键参数、使用场景与结果差异。
  • 能够识别本节相关的常见风险、易错点或排查思路。

学习重点

  • 主题范围:Linux 进程管理、总结、Linux 用户与组管理、创建与删除用户与组、useradd - 添加新用户、usermod - 修改用户信息
  • 重点命令:useraddusermoduserdelgroupaddgroupdelsudoumasksetgid
  • 学习重点:命令用途、关键参数、典型场景、与相近命令的区别
  • 复习方式:先理解场景,再动手练习,最后对照结果检查

Linux 进程管理

总结

进程管理是 Linux 系统管理的核心部分,涵盖了进程的监控、控制和优化。通过掌握 pstophtoppgrep 等工具,可以实时了解系统中运行的进程和资源使用情况;通过 killpkillkillallbgfgnohup 等命令,能够有效地控制和管理进程;通过理解守护进程、systemdsystemctl,可以高效地管理系统服务;通过调整进程优先级和使用 IPC 机制,如管道、命名管道、信号、消息队列和共享内存,能够优化系统性能和实现进程间的高效协作。

以下是基于具体实例的应用总结:

  • 查看当前系统中的所有进程:

    ps aux
    
  • 实时监控系统资源和进程状态:

    top
    
  • 使用 htop 提供更友好的进程监控界面:

    htop
    
  • 根据进程名称查找进程 PID 并终止进程:

    pkill nginx
    
  • 终止特定 PID 的进程并发送特定信号:

    kill -9 1500
    
  • 将前台进程暂停并转移到后台运行:

    # 启动进程
    gedit
    
    # 按 Ctrl+Z 暂停
    [1]+  Stopped                 gedit
    
    # 将进程放到后台
    bg
    
    # 查看后台任务
    jobs
    
    # 恢复进程到前台
    fg %1
    
  • 使用 nohup 启动长时间运行的任务,确保任务在用户注销后继续运行:

    nohup ./backup.sh > backup.log 2>&1 &
    
  • 管理系统服务,通过 systemctl 启动、停止、重启和查看服务状态:

    sudo systemctl start nginx
    sudo systemctl status nginx
    sudo systemctl restart nginx
    sudo systemctl enable nginx
    sudo systemctl disable nginx
    
  • 调整进程优先级,通过 nice renice 提高或降低进程的优先级:

    # 启动进程时设置 Nice 值
    nice -n 10 ./long_task.sh
    
    # 调整已运行进程的 Nice 值
    sudo renice 5 -p 1500
    
  • 使用共享内存和信号量实现高效的进程间通信和同步:

    // 生产者进程
    mq_send(mq, "Task 1", sizeof("Task 1"), 0);
    
    // 消费者进程
    mq_receive(mq, buffer, 1024, NULL);
    printf("Processing %s\n", buffer);
    

Linux 用户与组管理

创建与删除用户与组

用户与组管理的基本操作包括添加新用户、修改用户信息、删除用户、添加新组以及删除组。Linux 提供了一系列命令行工具来完成这些任务。

useradd - 添加新用户

useradd 命令用于在系统中创建一个新用户账户。通过该命令,可以指定用户的家目录、默认 shell、所属组等属性。

基本用法
sudo useradd [选项] 用户名
常用选项
  • -m:自动创建用户的家目录。
  • -s:指定用户的默认 shell。
  • -G:指定用户所属的附加组。
  • -c:添加用户的备注信息(如全名)。
  • -d:指定用户的家目录路径。
  • -u:指定用户的 UID(用户标识符)。
  • -p:设置用户的加密密码(通常不推荐直接使用此选项)。
示例与应用场景

示例 1:创建一个新用户 bob,并自动创建其家目录

sudo useradd -m bob

示例 2:创建一个新用户 alice,指定家目录、默认 shell 为 /bin/bash,并添加到组 developers

sudo useradd -m -d /home/alice -s /bin/bash -G developers -c "Alice Johnson" alice

说明:

  • -m:创建 /home/alice 作为用户的家目录。
  • -d /home/alice:指定家目录路径。
  • -s /bin/bash:设置默认 shell 为 Bash。
  • -G developers:将用户添加到 developers 组。
  • -c "Alice Johnson":添加备注信息。

应用场景:

  • 新员工入职:为新员工创建用户账户,分配适当的权限和所属组。
  • 系统服务账户:为运行特定服务(如数据库、Web 服务器)创建专用账户,增强系统安全性。

usermod - 修改用户信息

usermod 命令用于修改已存在的用户账户信息,如更改所属组、修改默认 shell、重命名用户等。

基本用法
sudo usermod [选项] 用户名
常见修改操作
  • 添加用户到附加组
  • 修改用户的默认 shell
  • 重命名用户
  • 更改用户的家目录
常用选项
  • -aG:将用户添加到一个或多个附加组,保持用户当前所属的其他组。
  • -G:指定用户所属的所有组,覆盖当前所属的附加组。
  • -s:修改用户的默认 shell。
  • -l:重命名用户。
  • -d:修改用户的家目录。
  • -L/-U:锁定或解锁用户账户。
示例与应用场景

示例 1:将用户 alice 添加到组 admin sudo

sudo usermod -aG admin,sudo alice

说明:

  • -aG admin,sudo:将 alice 添加到 adminsudo 组,同时保留其当前所属的其他组。

示例 2:修改用户 bob 的默认 shell 为 /bin/zsh

sudo usermod -s /bin/zsh bob

示例 3:重命名用户 charlie charles

sudo usermod -l charles charlie

示例 4:更改用户 david 的家目录为 /home/david_new 并移动现有文件

sudo usermod -d /home/david_new -m david

说明:

  • -d /home/david_new:指定新的家目录路径。
  • -m:移动现有的家目录内容到新的位置。

应用场景:

  • 权限调整:根据用户职责的变化,调整其所属组和权限。
  • 系统迁移:在系统迁移或重组时,调整用户的家目录和账户信息。
  • 安全策略更新:更改用户的默认 shell 以符合新的安全策略。

userdel - 删除用户

userdel 命令用于从系统中删除一个用户账户。可以选择是否删除用户的家目录及相关文件。

基本用法
sudo userdel [选项] 用户名
删除用户的同时删除家目录(-r 选项)
  • -r:删除用户的家目录及其中的所有文件,同时删除用户的邮件 spool。
注意事项与风险
  • 数据丢失风险:使用 -r 选项将永久删除用户的家目录及其所有内容,操作前应确认不再需要这些数据。
  • 进程关联:删除用户前,应确保该用户没有正在运行的进程,避免系统不稳定。
  • 权限问题:仅有超级用户或具有相应权限的用户才能删除其他用户账户。
示例与应用场景

示例 1:删除用户 bob,但保留其家目录

sudo userdel bob

示例 2:删除用户 alice 及其家目录

sudo userdel -r alice

说明:

  • -r:删除 /home/alice 及其中的所有文件。

应用场景:

  • 员工离职:在员工离职时,删除其用户账户及相关数据,以维护系统安全。
  • 临时账户清理:删除临时用户账户,释放系统资源。

groupadd - 添加新组

groupadd 命令用于在系统中创建一个新的用户组。通过该命令,可以指定组的 GID(组标识符)等属性。

基本用法
sudo groupadd [选项] 组名
常用选项
  • -g:指定组的 GID。
  • -o:允许创建具有重复 GID 的组(通常需要与 -g 一起使用)。
  • -r:创建系统组,GID 范围较低,适用于系统服务。
示例与应用场景

示例 1:创建一个新组 developers

sudo groupadd developers

示例 2:创建一个新组 admins,指定 GID 为 5000

sudo groupadd -g 5000 admins

示例 3:创建一个系统组 sysadmins

sudo groupadd -r sysadmins

应用场景:

  • 项目团队管理:为不同的项目团队创建独立的用户组,便于权限管理。
  • 系统服务组:为系统服务(如 Web 服务器、数据库服务器)创建专用组,增强系统安全性。
  • 资源访问控制:通过组管理,控制特定资源(如文件、目录)的访问权限。

groupdel - 删除组

groupdel 命令用于从系统中删除一个用户组。删除组前,应确保没有用户属于该组,以避免系统出现权限问题。

基本用法
sudo groupdel 组名
删除组的注意事项
  • 确保组内无用户:在删除组前,应确保没有用户属于该组。可以使用 getent group 组名 查看组内成员。
  • 系统组保护:避免删除系统保留的组(如 rootsudo 等),以维护系统稳定性。
常见错误与解决方法
  • 错误:组内有用户仍属于该组
    错误提示:

    groupdel: group 'developers' is still used by some users
    

    解决方法:

    1. 查看属于该组的用户

      getent group developers
      

      输出示例:

      developers:x:1001:alice,bob,charlie
      
    2. 将用户从该组中移除
      使用 usermod 命令移除用户的附加组:

      sudo usermod -G <其他组> alice
      sudo usermod -G <其他组> bob
      sudo usermod -G <其他组> charlie
      

      或使用 gpasswd 命令:

      sudo gpasswd -d alice developers
      sudo gpasswd -d bob developers
      sudo gpasswd -d charlie developers
      
    3. 重新尝试删除组

      sudo groupdel developers
      
  • 错误:尝试删除系统组
    错误提示:

    groupdel: cannot delete the primary group of user 'root'
    

    解决方法:

    避免删除系统组,除非确定其不再被任何系统用户使用。

示例与应用场景

示例 1:删除组 admins

sudo groupdel admins

示例 2:删除组 developers,确保组内无用户

getent group developers

sudo gpasswd -d alice developers
sudo gpasswd -d bob developers
sudo gpasswd -d charlie developers

sudo groupdel developers

应用场景:

  • 项目结束:项目完成后,删除相关的用户组,释放系统资源。
  • 权限调整:重新组织用户组结构,删除不再需要的组,优化权限管理。

用户权限与组权限管理

用户和组权限管理是确保系统安全和资源合理分配的关键。通过设置文件权限、管理用户和组的权限,以及配置 sudo 权限,可以有效地控制用户对系统资源的访问。

设置文件权限与所属组

文件权限控制决定了不同用户和组对文件和目录的访问权限。Linux 提供了 chmodchownchgrp 命令来管理文件和目录的权限与所有者。

使用 chmod 修改权限

chmod(change mode)命令用于更改文件或目录的权限。权限分为读(r)、写(w)、执行(x),分别针对所有者(u)、所属组(g)和其他用户(o)。

基本用法:

chmod [选项] 权限 文件/目录

权限表示方式:

  • 符号模式:使用 u(所有者)、g(所属组)、o(其他用户)、a(所有用户)和操作符 +(添加)、-(移除)、=(设置)。
    示例:为所有者添加执行权限

    chmod u+x script.sh
    
  • 数字模式:使用八进制数表示权限,每个权限类别(u、g、o)使用一位,读(4)、写(2)、执行(1)相加得到相应的数值。
    示例:设置权限为 755

    chmod 755 script.sh
    

    解释:

    • 7:所有者 rwx(4+2+1)
    • 5:所属组 r-x(4+0+1)
    • 5:其他用户 r-x(4+0+1)
使用 chown 修改所有者

chown(change owner)命令用于更改文件或目录的所有者和所属组。

基本用法:

sudo chown [选项] 新所有者[:新组] 文件/目录

示例:将文件 app.js 的所有者更改为 bob

sudo chown bob app.js

同时更改所有者和所属组:

sudo chown alice:developers app.js
使用 chgrp 修改所属组

chgrp(change group)命令专门用于更改文件或目录的所属组。

基本用法:

sudo chgrp [选项] 新组 文件/目录

示例:将文件 utils.py 的所属组更改为 staff

sudo chgrp staff utils.py
实例与应用场景

实例 1:设置目录的权限

将目录 project_alpha 的所有者设置为 alice,所属组设置为 developers,并设置权限为 755

sudo chown -R alice:developers /home/alice/Projects/project_alpha
sudo chmod -R 755 /home/alice/Projects/project_alpha

说明:

  • -R:递归地修改目录及其子目录和文件的所有者和权限。
  • 755:所有者具有读、写、执行权限,所属组和其他用户具有读、执行权限。

应用场景:

  • 项目目录管理:为项目目录设置适当的所有者和权限,确保团队成员能够访问和修改项目文件。
  • 共享资源:通过修改文件所属组和权限,控制不同用户对共享资源的访问权限。

sudo 权限配置

sudo(superuser do)允许授权用户以超级用户或其他用户的身份执行命令,而无需共享 root 密码。通过配置 sudo,可以精细地控制用户的权限,增强系统安全性。

安装与配置 sudo

大多数 Linux 发行版默认安装了 sudo。如果未安装,可以通过以下命令安装:

sudo apt-get install sudo      # Debian/Ubuntu
sudo yum install sudo          # CentOS/RHEL
sudo pacman -S sudo            # Arch Linux
编辑 /etc/sudoers 文件(使用 visudo

/etc/sudoers 文件定义了哪些用户或组可以使用 sudo 以及他们可以执行哪些命令。为了安全起见,建议使用 visudo 命令编辑该文件,它会在保存前检查语法错误,避免配置错误导致无法使用 sudo

编辑命令:

sudo visudo
配置特定用户或组的 sudo 权限

sudoers 文件中,可以通过以下方式配置用户和组的权限:

  • 授予特定用户所有权限

    alice ALL=(ALL:ALL) ALL
    

    解释:

    • alice:用户名。
    • ALL:从所有主机。
    • (ALL:ALL):以所有用户和组的身份运行。
    • ALL:允许执行所有命令。
  • 授予特定组所有权限

    %sudo ALL=(ALL:ALL) ALL
    

    解释:

    • %sudo:表示 sudo 组中的所有用户。
    • 其余部分同上。
  • 授予用户特定命令的权限

    bob ALL=(ALL) /usr/bin/systemctl, /usr/bin/kill
    

    解释:

    • bob:用户名。
    • ALL:从所有主机。
    • (ALL):以所有用户的身份运行。
    • /usr/bin/systemctl, /usr/bin/kill:允许执行的具体命令。
常见配置示例

示例 1:授予用户 charlie 使用 sudo 执行所有命令的权限

charlie ALL=(ALL:ALL) ALL

示例 2:授予组 admins 使用 sudo 执行所有命令的权限

%admins ALL=(ALL:ALL) ALL

示例 3:授予用户 david 仅使用 systemctl kill 命令的 sudo 权限

david ALL=(ALL) /usr/bin/systemctl, /usr/bin/kill

应用场景:

  • 分级权限管理:根据用户角色,授予不同级别的 sudo 权限,确保最小权限原则。
  • 任务限制:限制用户只能执行特定的管理任务,避免滥用权限。

配置文件权限继承

配置文件权限继承确保新创建的文件和目录自动继承其父目录的权限属性,简化权限管理和维护。

使用 umask 设置默认权限

umask(用户文件创建模式掩码)命令用于设置新创建文件和目录的默认权限掩码。umask 通过从默认权限中减去指定的掩码值来确定实际权限。

查看当前 umask
umask

输出示例:

0022

解释:

  • 0022 表示新文件默认权限为 644666 - 022),新目录默认权限为 755777 - 022)。
设置 umask

可以在用户的 shell 配置文件(如 .bashrc.bash_profile)中设置 umask,以确保每次登录时自动应用。

示例:将 umask 设置为 002,使新文件权限为 664,新目录权限为 775

echo "umask 002" >> ~/.bashrc
source ~/.bashrc

说明:

  • umask 002:允许所属组具有写权限,适用于团队协作环境。

配置继承权限的技巧(如 setgid 位)

设置目录的 setgid 位可以确保新创建的文件和子目录继承父目录的所属组,而不是创建者的主组。这在团队环境中尤为重要,确保所有成员创建的文件都属于统一的组。

设置 setgid

命令:

chmod g+s 目录名

示例:为目录 /home/alice/Projects 设置 setgid

sudo chmod g+s /home/alice/Projects

验证:

ls -ld /home/alice/Projects

输出示例:

drwxr-sr-x 2 alice developers 4096 Apr 27 10:40 /home/alice/Projects

说明:

  • s:表示 setgid 位已设置。
示例与应用场景

实例 1:团队项目目录管理

  1. 创建项目组 developers

    sudo groupadd developers
    
  2. 创建项目目录 /home/alice/Projects/project_alpha 并设置所属组

    sudo mkdir -p /home/alice/Projects/project_alpha
    sudo chown alice:developers /home/alice/Projects/project_alpha
    sudo chmod 2775 /home/alice/Projects/project_alpha
    

    解释:

    • 2775:设置目录权限为 rwxrwsr-x,其中 2 表示 setgid 位。
  3. 验证权限继承
    developers 组的成员在该目录下创建新文件时,文件的所属组将自动设置为 developers

    touch /home/alice/Projects/project_alpha/newfile.txt
    ls -l /home/alice/Projects/project_alpha/newfile.txt
    

    输出示例:

    -rw-rw-r-- 1 alice developers 0 Apr 27 10:50 newfile.txt
    

应用场景:

  • 团队协作:确保团队成员创建的文件统一属于特定组,简化权限管理。
  • 共享资源:在共享目录中设置 setgid,确保所有文件和子目录的所属组一致。

本节总结

  • 本节主要围绕 Linux 进程管理、总结、Linux 用户与组管理、创建与删除用户与组、useradd - 添加新用户 展开。
  • 需要重点掌握的命令或工具包括:useraddusermoduserdelgroupaddgroupdelsudo
  • 学习时应优先抓住「命令解决什么问题、在什么场景下使用、执行后会产生什么结果」。
  • 对涉及权限、覆盖、网络、系统服务、删除或安全配置的操作,建议先在测试环境练习。

复习建议

  • 先用自己的话复述本节每个主题或命令的作用,避免只记参数不懂用途。
  • 按原文示例至少手敲一遍典型命令,并观察输出变化。
  • 对高风险操作先确认路径、权限和目标对象,再执行实际命令。
  • 可优先复习这些高频命令:useraddusermoduserdelgroupaddgroupdelsudo