深入探索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 系统上的操作能力。
超级会员免费看
910

被折叠的 条评论
为什么被折叠?



