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),如果有必要或者有时间可以看看作者其他的帖子。

  • 创建用户有两条命令:adduseruseradd。对于初次接触 linux 的 菜鸟使用 adduser 即可。两者的区别以及各自的详细使用查看原帖。
  • 删除用户及其主目录:sudo userdel -r 用户名

系统管理

参考 Linux必学的系统管理命令

  • df命令用来检查文件系统的磁盘空间占用情况,使用权限是所有用户。

  • top命令用来显示执行中的程序进程,使用权限是所有用户。

  • free命令用来显示内存的使用情况,使用权限是所有用户。

  • quota命令用来显示磁盘使用情况和限制情况,使用权限超级用户。

  • at命令用来在指定时刻执行指定的命令序列。

  • lp是打印文件的命令,使用权限是所有用户。

  • useradd命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户。

  • groupadd命令用于将新组加入系统。

  • kill 命令 用来中止一个进程。

    1
    2
    3
    kill pid     # 通过发送缺省的 SIGTERM 信号到进程 pid 来停止它
    # 如果进程 pid 已经做了特殊安排来忽略或覆盖 SIGTERM 信号,这个进程实际可能不停止
    kill -9 pid # 发送信号 9,即 SIGKILL 信号。SIGKILL 信号是个通常不能被忽略或覆盖的特殊信号。
  • 使用crontab命令可以修改crontab配置文件,然后该配置由cron公用程序在适当的时间执行,该命令使用权限是所有用户。 表达真烂,读完这句话之后根本不知道 crontab 命令可以干什么。

  • 通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本

    有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的

    ps: 区分 cronCron Trigger

进程查看

参考 Linux进程查看命令

  • ps 命令:用于查看当前进程的情况

    • ps
    • ps aux
  • pstree命令:将进程用树状结构显示出来,显示出进程间的相互关系

    • pstree -Aup
  • top命令:动态显示系统当前任务情况,相当于任务管理器

kill 命令

参考 每天一个linux命令(42):kill命令

Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。

通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止。

kill命令是通过向进程发送指定的信号来结束相应进程的。

  1. 在默认情况下,采用编号为15的TERM信号。

    • 情景一:如果进程没有捕获该信号,则进程终止;
    • 情景二:这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。是优点,但也可能带来不便。
    • 问题:有时候清理资源耗时很长,呈现“假死”现象;甚至清理时出现问题,直接卡死…
  2. 可以使用编号为 9 的KILL信号,强行“杀掉”进程。

    • 优点:使用该信号可以无条件终止进程(其他的信号进程都可以捕获并选择忽略)。
    • 缺点:强行终止进程,常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。
    • 总之,发送 KILL 信号时必须小心,只有在万不得已时,才用 KILL 信号(9)

以下是常用的信号:(通过 kill -l 可以查看所有信号名称)

1
2
3
4
5
6
7
HUP     1    终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)

前台任务、后台任务

了解前台任务、后台任务及两者之间的切换之前:

  1. 要先熟悉 kill 命令,及常用信号(通过 kill -l 可以查看所有信号名称)。

  2. 要知道进程组(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的nohup命令的用法

延伸阅读:

  1. 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、修改所有打开该终端的文件句柄,改成一个不可读不可写的实现;


  2. 让进程在后台可靠运行的几种方法

    方法好几种。目前能够熟练运用其中的 nohup 即可。

  3. Linux终端类型介绍,有关的帖子差不多都是这些内容,看来看去头脑中对于“终端”这个概念还是浆糊

Vim

关于 Vim 的操作及配置,见另一篇笔记 《Vim 操作及其配置.md》。