43、深入探索Linux系统控制与BASH shell使用

深入探索Linux系统控制与BASH shell使用

1. 系统调整与进程优先级

在对系统进行调整后,系统的响应能力通常会有所恢复,但恢复程度取决于所运行程序的性质。有时,你可能会尝试提高某个进程的优先级,以使其运行得更快,但由于Linux内核的复杂性,这可能无法达到预期效果,甚至可能引发严重问题。因此,调整进程优先级(renice)时要谨慎,仅在必要时进行操作。

调整优先级可以通过在命令提示符下使用 renice 命令来实现,这样就无需使用 top 工具。此外, nice 命令也很有用,它可以在进程启动前设置其初始优先级。若要了解更多信息,可以查看 renice nice 的手册页。

2. 进程控制

在Linux系统中,尽管运行的进程通常是隐藏的,但用户可以对其进行全面且不受限制的控制。用户能够终止进程、更改其属性,并获取关于进程的所有信息。

普通用户对自己启动的进程拥有完全控制权(僵尸进程除外),而根用户(或拥有超级用户权限的用户)则可以控制所有普通用户创建的进程以及系统自身启动的进程。这种控制能力的赋予,是为了在出现问题(如程序崩溃且无法正常终止)时进行修复。普通用户在进行此类操作时,虽然不会损坏当前运行的系统,但可能会给自己带来一些问题。这种对进程的控制能力正是Linux系统如此可靠的原因之一,因为任何用户都可以深入内核的工作机制,终止单个进程,从而在对系统其他部分影响极小的情况下清理崩溃的程序。

3. 终止进程

当你退出程序或程序完成任务时,它会自动终止自身进程以及为运行而创建的其他子进程。主进程称为父进程,其创建的进程称为子进程。

你可以使用 pstree 命令查看进程的父子关系,添加 -p 选项可以显示进程的PID。为了方便浏览结果,可以将输出通过管道传递给 less 命令,例如: pstree -p | less

然而,有些行为异常的程序可能不会自动终止,或者程序崩溃后无法自行结束进程。在极少数情况下,一些看似正常的程序可能会过度占用系统资源,导致系统无故变慢。

对于这些问题进程,有时可以通过注销并立即重新登录来解决,但这种方法仅适用于登录后启动的进程,对系统进程无效。另一种方法是手动终止进程,使用 top 工具可以轻松实现。具体步骤如下:
1. 在 top 中找到与问题程序名称匹配的进程。例如,Mozilla Firefox浏览器通常以 firefox-bin 进程运行。
2. 由于 top 不会显示所有进程,为了更方便地找到问题进程,可以在 top 中输入 u ,然后输入当前登录的用户名,这样可以只显示该用户创建的进程。
3. 找到崩溃的进程后,记录其PID(位于列表最左侧)。
4. 输入 k ,然后输入PID,再按 Enter 键(默认信号值为15,表示要求程序终止)。

如果进程没有消失,可能有无法终止的原因。此时,可以重复上述步骤,但当 top 询问信号值时,不接受默认的15,而是输入9并按 Enter 键,这将强制终止进程。不过,只有在确实需要终止进程时才使用此方法,因为强制终止可能会导致程序无法正常释放资源,从而造成数据丢失。

4. 控制僵尸进程

僵尸进程是指其父进程已无法访问(例如已终止),但由于某些原因未能带走其子进程的进程。僵尸进程偶尔会出现,通常它们是无害的,但在某些情况下可能会导致混淆,使进程重启失败,因此有时需要手动终止它们。

top 的右上角可以看到系统中正在运行的僵尸进程数量。僵尸进程在 top 的进程列表中,其状态(S)列会显示为 Z 。要终止僵尸进程,输入 k ,然后输入其PID,接着输入9(而非接受默认信号值15)。

在很多情况下,僵尸进程会自行消失,但有时不会。此时,你有两种选择:一是注销并重新登录,二是重启计算机。

5. 使用其他命令控制进程

除了 top 工具,还有一些快速便捷的shell命令可以用于诊断和处理进程问题。
- ps 命令 :用于显示系统中当前运行的进程列表,通常与 aux 选项一起使用,例如: ps aux 。该命令的输出与 top 类似。如果你能在输出中找到问题进程,记录其PID,然后使用 kill 命令终止它,例如: kill 5122 。如果进程未被终止,可以使用 top 进行更深入的调查。
- killall 命令 :如果你知道程序的进程名,可以使用该命令终止进程。例如,要终止Firefox浏览器的主进程 firefox-bin ,可以使用命令: killall firefox-bin 。使用 killall 命令时要尽可能具体,因为像 killall bin 这样的命令会终止所有进程名中包含 bin 的进程。

6. 清理崩溃程序

当程序崩溃时,可能会导致正在使用的shell停止工作,或者整个GUI出现问题。在这种情况下,要记住可以同时运行多个命令行shell实例。例如,如果一个进程崩溃导致GNOME Terminal锁定,你可以通过 Ctrl + Alt + t 启动一个新的GNOME Terminal窗口,然后在新窗口中使用 top 工具终止导致问题的进程。

如果崩溃的程序影响了整个GUI,可以通过按下 Ctrl + Alt + F1 切换到虚拟控制台。此时GUI会隐藏,但不会被终止,所有程序仍在运行。你可以在虚拟控制台中使用 top 工具尝试终止问题进程。完成后,按下 Ctrl + Alt + F7 可以切换回GUI。

如果你知道崩溃程序的名称,可以使用 pgrep 命令快速找到其PID,然后使用 kill 命令终止它。例如,如果Nautilus文件管理器冻结,可以使用命令 pgrep nautilus 获取其PID,然后使用 kill 命令结合该PID终止进程。

7. 作业控制

在shell中启动程序时,会为其分配一个作业号。作业与进程是不同的概念,主要用于帮助用户了解系统中当前正在运行的程序。

你可以在shell提示符下输入 jobs 命令查看当前正在运行的作业。当运行一个程序时,它通常会占用shell,直到任务完成。但你可以在命令后添加 & 符号,使程序在后台运行。不过,对于需要用户输入的命令(如 vim top ),这种方法不太适用,但对于一些长时间运行的命令很方便。

例如,要解压一个大的Zip文件,可以使用 unzip 命令。在Windows中,解压大文件可能会使shell长时间无法使用,但在Linux中,你可以使用以下命令在后台解压文件,同时继续使用shell: unzip myfile.zip & 。执行该命令后,会显示类似 [1] 7483 的信息,这表示 unzip 命令正在后台运行,作业号为1,进程号为7483(需要注意的是,有些程序启动时会立即启动其他进程并终止当前进程,因此进程号可能不准确)。

如果你启动了多个后台作业,可以使用作业号切换到相应的作业。例如,输入 %3 可以切换到作业号为3的后台作业。按下 Ctrl + Z 可以暂停当前运行的作业,使其进入休眠状态。要重新启动作业,可以切换回该作业,或者使用命令 %2 & 在后台重新启动作业号为2的作业。输入 fg 可以将后台作业切换到前台运行。

当后台作业完成时,shell会显示类似 [1]+ Done unzip myfile.zip 的信息。使用作业控制可以有效地管理工作负载。例如,在使用 vim 编辑文件时,可以按下 Ctrl + Z 暂停 vim ,返回shell执行其他命令,之后可以使用 fg % 加上作业号恢复 vim 。你还可以使用 kill %<jobnumber> 命令根据作业号终止作业,例如 kill %2 可以终止作业号为2的作业。另外, Ctrl + C 可以立即终止当前正在运行的作业,对于意外启动的长时间运行的命令很有用。

8. NOHUP命令

当你在终端窗口中启动一个命令,然后想关闭该窗口时,窗口内启动的进程通常也会随之关闭。这是因为关闭窗口时,父进程会向其启动的进程发送挂起信号。虽然有些进程可以忽略该信号,但大多数进程会终止。

为了解决这个问题,可以使用 nohup 命令。 nohup 表示不挂起,它可以让指定的命令在启动它的进程结束后继续运行(技术上是让命令忽略 SIGHUP 信号)。不过,通过 nohup 运行的命令仍然可以像普通命令一样被终止。

使用 nohup 命令时,只需在命令前添加 nohup 即可,例如: nohup unzip myfile.zip 。如果命令需要 sudo gksu 权限,在 nohup 命令后添加相应的权限。命令的输出(包括错误信息)会被发送到 nohup.out 文件中,你可以使用文本编辑器查看该文件。需要注意的是,如果使用 sudo gksu 通过 nohup 运行命令, nohup.out 文件将具有root权限。在这种情况下,普通用户再次使用 nohup 之前,需要使用 sudo 删除 nohup.out 文件,否则 nohup 无法覆盖该文件。

9. 认识BASH shell

严格来说,Linux指的只是内核,它是运行计算机并让一切功能得以实现的基础程序。但内核本身是无用的,它需要程序让用户与计算机进行交互,还需要大量的系统文件(也称为库)来提供重要功能。

GNU项目提供了许多底层代码和程序,这就是为什么很多人将Linux操作系统称为GNU/Linux,因为没有GNU组件,Linux可能无法起步。GNU项目还提供了各种shell程序。shell是用户日常与系统交互的界面,可以通过鼠标或键盘操作。这个词源于shell是操作系统的外层,它封装了内核(在某些情况下,通过过滤不良用户命令来保护内核)。有些shell提供图形功能,但一般而言,shell指的是纯文本界面,这些文本shell程序也被称为终端程序,通常被通俗地称为命令行提示符。这种shell可以让你快速有效地控制系统。

虽然现在使用shell不是必需的,因为在Ubuntu中几乎所有操作都可以通过图形界面完成,但使用shell能让你真正成为系统的主人。BASH shell是Ubuntu系统的默认shell。对于Windows用户来说,最好的解释方式是将其与DOS命令提示符进行比较。BASH shell可以让你通过键盘直接向操作系统发出命令,而无需使用鼠标和窗口(尽管有时可以在BASH shell中使用鼠标进行文本复制和粘贴,以及控制简单的基于文本的菜单)。两者的主要区别在于,BASH shell几乎涵盖了系统上所有操作的命令,而DOS命令提示符主要局限于文件和目录的操作和查看工具。

过去,DOS命令提示符是整个操作系统的可见层,DOS程序就是在这个环境中运行的。而BASH shell只是访问Linux内核和子系统的众多方式之一。虽然很多程序是通过BASH shell运行的,但实际上大多数程序是在Linux操作系统上运行的,只是通过BASH shell获取输入并显示输出。长期使用Windows的用户可能会对BASH shell感到谨慎,因为它代表了一种全新的工作方式和需要学习的新概念。不可否认,对于新手来说,shell确实带来了很多挑战,但它也带来了巨大的回报。

以下是一些关键命令的总结表格:
| 命令 | 作用 | 示例 |
| — | — | — |
| renice | 调整进程优先级 | renice -n 10 <PID> |
| nice | 设置进程初始优先级 | nice -n 5 command |
| pstree | 显示进程树 | pstree -p |
| ps aux | 显示当前运行的进程列表 | ps aux |
| kill | 终止进程 | kill 5122 |
| killall | 根据进程名终止进程 | killall firefox-bin |
| pgrep | 根据程序名查找PID | pgrep nautilus |
| jobs | 显示当前作业 | jobs |
| nohup | 让命令在后台持续运行 | nohup unzip myfile.zip |

下面是一个简单的mermaid流程图,展示了处理问题进程的基本流程:

graph TD;
    A[发现系统变慢或程序异常] --> B{是否知道问题程序名};
    B -- 是 --> C[使用pgrep查找PID];
    B -- 否 --> D[使用top查找进程];
    C --> E[使用kill命令终止进程];
    D --> E;
    E --> F{进程是否终止};
    F -- 是 --> G[问题解决];
    F -- 否 --> H[使用top强制终止进程];
    H --> I{进程是否终止};
    I -- 是 --> G;
    I -- 否 --> J[考虑注销或重启];

通过掌握这些系统控制和BASH shell的使用方法,你可以更好地管理和维护Linux系统,提高工作效率。

深入探索Linux系统控制与BASH shell使用

10. BASH shell的优势与特点

BASH shell之所以成为Ubuntu系统的默认shell,有其独特的优势和特点。

  • 命令丰富性 :如前文所述,BASH shell拥有几乎涵盖系统所有操作的命令。无论是文件管理、进程控制,还是系统配置,都能找到对应的命令来完成任务。例如,在文件管理方面, ls 用于列出文件和目录, cp 用于复制文件, mv 用于移动或重命名文件等。
  • 脚本编程能力 :BASH shell支持脚本编程,用户可以编写一系列命令组合成一个脚本文件,实现自动化任务。比如,编写一个脚本用于定期备份重要文件:
#!/bin/bash
# 定义备份源目录和目标目录
source_dir="/home/user/documents"
backup_dir="/home/user/backup"
# 创建备份目录(如果不存在)
mkdir -p $backup_dir
# 执行备份操作
cp -r $source_dir $backup_dir

将上述代码保存为一个 .sh 文件,如 backup.sh ,然后赋予执行权限 chmod +x backup.sh ,就可以运行该脚本来完成备份任务。
- 历史命令管理 :BASH shell会记录用户输入的命令历史,用户可以通过上下箭头键快速访问之前输入过的命令,还可以使用 history 命令查看所有历史命令。此外,使用 ! 符号可以快速重复执行上一个命令,如 !! ,或者执行历史命令中指定编号的命令,如 !10 表示执行历史命令列表中编号为 10 的命令。

11. 高级进程管理技巧

除了前面提到的基本进程控制方法,还有一些高级技巧可以帮助你更精细地管理进程。

  • 进程优先级调整策略 :在实际应用中,合理调整进程优先级可以优化系统资源分配。例如,对于一些对实时性要求较高的进程,如视频编码、游戏等,可以适当提高其优先级;而对于一些后台任务,如系统更新、数据备份等,可以降低其优先级,以免影响前台程序的运行。在使用 renice 命令调整优先级时,优先级范围通常是 -20 到 19,数值越小优先级越高。例如,将进程 PID 为 1234 的优先级提高到 -10,可以使用命令 renice -n -10 1234
  • 进程监控工具 :除了 top 工具,还有一些其他的进程监控工具可以提供更详细的信息。例如, htop 是一个交互式的进程监控工具,它提供了比 top 更直观的界面,支持鼠标操作,并且可以实时显示进程的详细信息,如 CPU 使用率、内存使用率、线程数等。安装 htop 可以使用命令 sudo apt-get install htop ,安装完成后直接在终端输入 htop 即可启动。
12. 作业管理的高级应用

作业管理不仅可以提高工作效率,还可以实现一些复杂的任务调度。

  • 作业链的创建 :你可以通过 && || 符号将多个命令组合成一个作业链。 && 表示前一个命令执行成功后才执行下一个命令, || 表示前一个命令执行失败后才执行下一个命令。例如, command1 && command2 表示只有当 command1 执行成功后,才会执行 command2 command1 || command2 表示如果 command1 执行失败,才会执行 command2
  • 作业定时执行 :使用 at cron 工具可以实现作业的定时执行。 at 用于在指定的时间执行一次作业,例如,要在明天下午 3 点执行一个备份脚本 backup.sh ,可以使用命令 at 3pm tomorrow <<< "bash /path/to/backup.sh" cron 则用于定期执行作业,你可以编辑 /etc/crontab 文件或使用 crontab -e 命令来设置定时任务。例如,要每天凌晨 2 点执行一次系统更新,可以在 crontab 文件中添加一行 0 2 * * * sudo apt-get update
13. BASH shell的快捷键与别名

掌握 BASH shell 的快捷键和别名可以大大提高操作效率。

  • 常用快捷键
  • Ctrl + A :将光标移动到命令行的开头。
  • Ctrl + E :将光标移动到命令行的结尾。
  • Ctrl + U :删除从光标位置到命令行开头的所有字符。
  • Ctrl + K :删除从光标位置到命令行结尾的所有字符。
  • Tab :自动补全命令或文件名。
  • 别名设置 :别名可以为常用的长命令设置一个简短的名称。例如,将 ls -l 设置为别名 ll ,可以在 ~/.bashrc 文件中添加一行 alias ll='ls -l' ,然后执行 source ~/.bashrc 使设置生效。之后,在终端输入 ll 就相当于输入 ls -l
14. 系统安全与进程控制

在进行进程控制和使用 BASH shell 时,需要注意系统安全问题。

  • 权限管理 :普通用户只能控制自己启动的进程,而根用户可以控制所有进程。因此,在使用 sudo 或获取超级用户权限时要谨慎,避免误操作导致系统安全问题。例如,在使用 kill 命令终止进程时,要确保输入的 PID 正确,避免误杀其他重要进程。
  • 防范恶意进程 :定期使用进程监控工具检查系统中是否存在异常进程。如果发现某个进程占用过高的 CPU 或内存资源,并且无法确定其来源和用途,要及时终止该进程。同时,要注意从正规渠道下载和安装软件,避免安装带有恶意代码的程序。
15. 总结与展望

通过对 Linux 系统控制和 BASH shell 使用的深入学习,我们了解了如何调整系统进程优先级、控制进程和作业、清理崩溃程序,以及使用 BASH shell 进行高效操作。掌握这些知识和技能可以让我们更好地管理和维护 Linux 系统,提高工作效率。

在未来,随着 Linux 系统的不断发展和应用场景的不断拓展,系统控制和 BASH shell 的使用将变得更加重要。例如,在云计算、大数据、人工智能等领域,Linux 系统作为服务器操作系统的主流选择,对系统管理和自动化运维的要求越来越高。因此,不断学习和掌握 Linux 系统控制和 BASH shell 的高级技巧,将有助于我们在这些领域取得更好的发展。

以下是一个关于 BASH shell 快捷键和别名的总结表格:
| 类型 | 操作 | 说明 |
| — | — | — |
| 快捷键 | Ctrl + A | 光标移动到命令行开头 |
| 快捷键 | Ctrl + E | 光标移动到命令行结尾 |
| 快捷键 | Ctrl + U | 删除光标到命令行开头字符 |
| 快捷键 | Ctrl + K | 删除光标到命令行结尾字符 |
| 快捷键 | Tab | 自动补全命令或文件名 |
| 别名 | alias ll='ls -l' | 将 ls -l 设为 ll |

下面是一个 mermaid 流程图,展示了使用 BASH shell 进行文件备份的流程:

graph TD;
    A[开始] --> B{是否需要备份文件};
    B -- 是 --> C[定义源目录和目标目录];
    B -- 否 --> D[结束];
    C --> E[创建目标目录(如果不存在)];
    E --> F[执行备份操作];
    F --> G{备份是否成功};
    G -- 是 --> H[输出备份成功信息];
    G -- 否 --> I[输出备份失败信息];
    H --> D;
    I --> D;

希望通过本文的介绍,你能够更加深入地了解 Linux 系统控制和 BASH shell 的使用,提升自己在 Linux 系统上的操作能力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值