Jade Dungeon

Linux进程

Linux作业(jobs)

  • 中断任务:Control + C
  • 挂起任务:Control + Z
  • 显示当前任务的作业号:jobs

可以通过百分号(%)加作业号的方式来指定作业。例如:

bg %8                # 指定任务8在后台执行
fg %8                # 指定任务8在前台执行
  • 终止任务:
    • kill -TERM %8
    • kill -15 %8
  • 强制终止任务:
    • kill -KILL %8
    • kill -9 %8

例子:进程控制

如果有一个运行时间很长的程序,怕万一终端断了连接程序也断了。 没有在tmux里运行也没有加上nohup 执行。有什么办法以上它中断:

  • CONTROL + Z中断。
  • 然后输入bg命令让程序进入后台。这时程序会自动恢复运行。
  • 然后输入disown命令,防止程序因为父进程的中断而被中断。

注意如果程序有输出,那么bg命令命令让程序进入后台。这时程序会自动恢复运行。 输出的内容会打乱输入disown的内容,但是不用管它,只要按对disown几个键正确就好。 还有一个办法就是把bgdisown一起输入,用bg;disown

Linux进程

进程4要素

  • 要有一段程序供该进程运行
  • 进程专用的系统堆栈空间
  • 进程控制块(PCB),具体实现是task_struct结构
  • 有独立的存储空间

Linux系统中所有的进程是相互联系的,除了初始化进程外,所有进程都有一个父进程。 新的进程不是被创建,而是被复制,或是从以前的进程复制而来。 Linux中所有的进程都是由一个进程号为1的init进程衍生而来的。

Linux系统包括3种不同类型的进程,每种进程都有自己的特点和属性:

  • 交互进程:由一个Shell启动的进程,既可以在前台运行,又可以在后台运行
  • 批处理进程:这种进程和终端没有联系,是一个进程序列
  • 监控进程(守护进程):Linux启动时启动的进程,并在后台运行

进程控制块

在Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控制块(PCB, Process Control Block),描述进程的运动变化过程,与进程是一一对应的关系。 通常PCB包含以下信息:

  • 进程标识符:每个进程的唯一标识符,可以是字符串,也可以是数字。
  • 进程当前状态:为方便管理,相同状态的进程会组成一个队列,如就绪进程队列。
  • 进程相应的程序和数据地址:以便把PCB与其程序和数据联系起来。
  • 进程资源清单:列出所有除CPU外的资源记录,如拥有的I/O设备,打开的文件列表等。
  • 进程优先级:反映进程的紧迫程度,通常由用户指定和系统设置。
  • CPU现场保护区:当进程因某种原因不能继续占用CPU时,释放CPU, 需要将CPU的各种状态信息保护起来。
  • 进程同步与通信机制:用于实现进程间互斥、同步和通信所需的信号量等。
  • 进程所在队列PCB的链接字:根据进程所处的现行状态,进程相应的PCB参加到不同队列中, PCB链接字指出该进程所在队列中下一进程PCB的首地址。
  • 与进程有关的其它信息:如进程记账信息,进程占用CPU的时间等。

进程查看工具

查看进程信息:ps

通过ps命令可以查看系统中目前有多少进程正常运行 通过ps-aux命令可以查看每个进程的详细信息

输出一个用户的进程和线程。选项L(列出线程),选项-F(完整格式化)

$ ps -LF -u avi
avi 21645 3717 21766 0 5 66168 117164 1 18:58 ? 00:00:00 /usr/
avi 21645 3717 21768 0 5 66168 117164 1 18:58 ? 00:00:00 /usr/
avi 22314 3717 22314 0 2 42797 50332 0 19:00 ? 00:00:40 /usr/
avi 22314 3717 22316 0 2 42797 50332 1 19:00 ? 00:00:00 /usr/
avi 22678 24621 22678 0 1 969 1060 1 21:05 pts/1 00:00:00 ps -L
avi 23051 3717 23051 0 2 37583 45444 1 19:03 ? 00:00:52 /usr/
avi 23051 3717 23053 0 2 37583 45444 0 19:03 ? 00:00:03 /usr/
avi 23652 1 23652 0 2 22092 12520 0 19:06 ? 00:00:22 gnome
avi 23652 1 23655 0 2 22092 12520 0 19:06 ? 00:00:00 gnome

按资源占用排序进程:top

排序

Sorting with -O (Uppercase Letter O).

Press Shift+O to Sort field via field letter, for example press a letter to sort process with PID (Process ID).

Type any key to return to main top window with sorted PID order as shown in below screen. Press q to quit exit the window. Sorting Process ID's

显示指定用户的进程

Use top command with u option will display specific User process details.

# top -u tecmint
突出运行中的进程

Press z option in running top command will display running process in color which may help you to identified running process easily.

Shows Absolute Path of Processes

Press c option in running top command, it will display absolute path of running process.

Change Delay or Set ‘Screen Refresh Interval’ in Top

By default screen refresh interval is 3.0 seconds, same can be change pressing d option in running top command and change it as desired as shown below.

Kill running process

Kill running process with argument k

You can kill a process after finding PID of process by pressing k option in running top command without exiting from top window as shown below.

Sort by CPU Utilisation

Press Shift+P to sort processes as per CPU utilization. See screenshot below.

Renice a Process

You can use r option to change the priority of the process also called Renice.

Save Top Command Results

Press Shift+W to save the running top command results under /root/.toprc.

按进程号终止进程:kill

假设你想杀死已经没有响应的apache2进程,运行如下命令:

root@tecmint:~# ps -A | grep -i apache2
 
1285 ?        00:00:00 apache2

搜索apache2进程,找到PID并杀掉它.例如:在本例中apache2进程的PID是1285..

root@tecmint:~# kill 1285

注意:每次你重新运行一个进程或者启动系统,每个进程都会生成一个新的PID.你可以使用 ps命令获得当前运行进程的PID.

按进程关键字终止进程

利用管道和替换将 进程名对应的进程号提出来作为kill的参数:

kill -9 $(ps -ef|grep 进程名关键字|grep -v grep|awk '{print $2}')

很显然上面的方法能完成但是过于复杂,下面这种就显得简单的多了:

kill -9 $(pidof 进程名关键字) 
不要用kill -9

Perl语言专家Randal Schwartz在一篇短文里这样写:

no no no.不要使用kill -9。它没有给进程留下善后的机会:

  • 关闭socket链接
  • 清理临时文件
  • 将自己将要被销毁的消息通知给子进程
  • 重置自己的终止状态

等等。

通常,应该发送15,等一两秒钟,如果没效果,发送2,如果还不行,发送1。 如果还不行,那你应该把那个程序删掉,因为那个程序写的太烂了!

不要使用kill -9。不要用收割机来修剪花盆里的花。

总之,在使用kill -9前,你应该先使用kill -15,给目标进程一个清理善后工作的 机会。(进程也许无法捕捉或直接忽略SIGKILL信号,但它们可以,通常也是能够捕捉 SIGTERM信号的。)。如果你不留机会让进程完成清理工作,它们会留下一些不完整的文件或 状态,当系统重启时,程序将无法理解这些状态。

strace/trussltracegdb都是查看一个卡住的进程因何卡住的好工具。( Solaris里的truss -u非常好用;)Solaris里还有一些非常有用的/proc相关的工具, 有一些已经被移植到了Linux上。

按进程名终止进程:pkill

另一个杀死进程的方法是:

root@tecmint:~# pkill apache2

注意:kill需要PID作为参数,pkill可以选择应用的方式,比如指定进程的所有者等.