Linux 操作
对于linux的学习会是一个很漫长、很有趣的过程。对于 Linux 命令的学习、日积月累,推荐 竹子-每日一个linux命令、工具参考篇
首先,你要知道哪些命令大概什么功能,能完成什么操作(这个重在积累,如果不知道只能 Google 之了),简单入门推荐 最常用的20条命令。然后,关于命令的具体用法可以 Google 之,也可以使用 --help
man
等帮助。
最常用的命令
要有意识使用 --help
参数。
cd ls cp mv rm cat 目前已不必多说。
grep find tar 参数多多,多记多用。
file time 算是两个小惊喜
file:该命令用于判断接在file命令后的文件的基本数据,因为在Linux下文件的类型并不是以后缀为分的,所以这个命令对我们来说就很有用了
time:该命令用于测算一个命令(即程序)的执行时间。chown chgrp chmod
有一个很棒的tree命令,可以用来查看目录的树形结构。这个工具需要自己安装。使用方面可以参考linux tree命令,常用的:
- tree:当前目录下的所有内容显示
- tree -L level:只显示当前目录下指定最大深度的目录结构
用户管理
参考 linux用户管理(1),如果有必要或者有时间可以看看作者其他的帖子。
- 创建用户有两条命令:
adduser
和useradd
。对于初次接触 linux 的 菜鸟使用adduser
即可。两者的区别以及各自的详细使用查看原帖。 - 删除用户及其主目录:
sudo userdel -r 用户名
系统管理
df命令用来检查文件系统的磁盘空间占用情况,使用权限是所有用户。
top命令用来显示执行中的程序进程,使用权限是所有用户。
free命令用来显示内存的使用情况,使用权限是所有用户。
quota命令用来显示磁盘使用情况和限制情况,使用权限超级用户。
at命令用来在指定时刻执行指定的命令序列。
lp是打印文件的命令,使用权限是所有用户。
useradd命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户。
groupadd命令用于将新组加入系统。
kill 命令 用来中止一个进程。
1
2
3kill pid # 通过发送缺省的 SIGTERM 信号到进程 pid 来停止它
# 如果进程 pid 已经做了特殊安排来忽略或覆盖 SIGTERM 信号,这个进程实际可能不停止
kill -9 pid # 发送信号 9,即 SIGKILL 信号。SIGKILL 信号是个通常不能被忽略或覆盖的特殊信号。使用crontab命令可以修改crontab配置文件,然后该配置由cron公用程序在适当的时间执行,该命令使用权限是所有用户。表达真烂,读完这句话之后根本不知道 crontab 命令可以干什么。通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本
有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的
ps: 区分 cron 和 Cron Trigger
进程查看
参考 Linux进程查看命令
ps 命令:用于查看当前进程的情况
- ps
- ps aux
pstree命令:将进程用树状结构显示出来,显示出进程间的相互关系
- pstree -Aup
top命令:动态显示系统当前任务情况,相当于任务管理器
kill 命令
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。
通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止。
kill命令是通过向进程发送指定的信号来结束相应进程的。
在默认情况下,采用编号为15的TERM信号。
- 情景一:如果进程没有捕获该信号,则进程终止;
- 情景二:这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。是优点,但也可能带来不便。
- 问题:有时候清理资源耗时很长,呈现“假死”现象;甚至清理时出现问题,直接卡死…
可以使用编号为 9 的KILL信号,强行“杀掉”进程。
- 优点:使用该信号可以无条件终止进程(其他的信号进程都可以捕获并选择忽略)。
- 缺点:强行终止进程,常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。
- 总之,发送 KILL 信号时必须小心,只有在万不得已时,才用 KILL 信号(9)
以下是常用的信号:(通过 kill -l 可以查看所有信号名称)
1 | HUP 1 终端断线 |
前台任务、后台任务
了解前台任务、后台任务及两者之间的切换之前:
要先熟悉 kill 命令,及常用信号(通过 kill -l 可以查看所有信号名称)。
要知道进程组(process group)、会话(session)的概念,参考 Linux进程关系
会话中的每个进程组称为一个工作(job)。
参考 Unix或Linux中&、jobs、fg、bg等命令的使用方法
- ctrl-C:(kill foreground process) 发送 SIGINT 信号给前台进程,强制终止程序的执行;
- ctrl-Z:(suspend foreground process) 发送 SIGTSTP 信号给前台进程,将正在前台执行的进程放到后台,并且暂停。
- fg:将后台中的进程调至前台继续运行,此时可以使用 ctrl-z 再次挂起该进程。注意区分后台命令序号和 pid
- bg:将一个后台暂停的进程继续执行,此时将无法使用 ctrl-z 再次挂起该进程
- &:command& 让进程在后台运行
- jobs:查看后台运行的进程(挂起的 + 正在运行的)/列出当前shell环境中已启动的任务
关闭终端(未整理)
- nohup
关闭终端本质是退出账户?是会话结束?
延伸阅读:
linux会话浅析,对整体的理解很有帮助
相比于普通的读写,终端还实现了很多可以通过ioctl系统调用进行配置的功能。包括(1)功能键;(2)终端控制输入输出的流向;(3)等等
输入输出流向控制,只有前台进程组能够从终端中读数据、而不管前台后台程序都能向终端写数据。这点也是必须的,跟用户进程交互的是前台进程,用户的输入当然不能被其他后台进程抢走。但是一个进程是前台还是后台,是它自己是所不知道的,没法靠进程自己来判断什么时候可以读终端、什么时候不能读。所以需要终端来提供支持,如果后台进程读这个终端,终端的驱动程序将向其发送SIGTTIN信号,从而将其挂起。直到shell将其重新置为前台进程时(通过fg命令),该进程才会继续执行;
终端提供的这些功能未必都会被打开它的程序使用到。而像shell这样为人机交互而生的程序,则注定会跟终端打交道。
前台、后台概念是 Shell 的,也是由其控制的。(niel-)
Session leader进程的退出,将导致它所连接的终端被hangup,这意味着会话结束。反过来,像ssh这样的远程连接也可以通过断开连接的方式来使终端hangup,这将使得leader进程收到SIGHUP信号而退出。
具体来说,当终端hangup时,内核会有如下两个动作:
1、向对应会话的leader进程发送SIGHUP信号。而一般来说,会话的leader进程很可能是一个shell,它在收到SIGHUP信号后,并不是马上退出,而是会向它所启动的子进程都各自发送一个SIGHUP信号,将它们都杀死,然后自己才退出。不过,如果是这个作为leader进程shell自己退出,而导致终端hangup的话,向其子进程发送SIGHUP信号的事情就不会发生了,因为shell退出在先,它再也不会收到SIGHUP信号;
2、修改所有打开该终端的文件句柄,改成一个不可读不可写的实现;
-
方法好几种。目前能够熟练运用其中的 nohup 即可。
Linux终端类型介绍,有关的帖子差不多都是这些内容,看来看去头脑中对于“终端”这个概念还是浆糊
Vim
关于 Vim 的操作及配置,见另一篇笔记 《Vim 操作及其配置.md》。