linux&,nohup和screen的比较

&

首先,linux进程是区分前台进程和后台进程的。
通常,在终端输入的命令执行的前台进程模式。如果一个命令要执行好久,就会阻塞住终端好久,不能进行其他工作,所以,我们可以把执行花费时间很长的任务使用后台进程模式运行,我们就可以在同一终端干其他事!、

以前台进程模式运行

通常使用的方式

1
[root@localhost cdnjs]# find / -name xml &

以后台进程模式运行

1
[root@localhost cdnjs]# find / -name xml &

这样,这个查找程序就会在后台运行。它运行的同时不影响你干别的事情。
在后台运行时,找到符合的文件,还是会在终端中输出。

查看后台任务

1
2
[root@localhost cdnjs]# jobs
[1]+ 已停止 find / -name xml

切换前台/后台模式

前台切后台

在运行命令后,有的时候忘记了在命令之后加上‘&’符号,又不愿意停下此命令重新改写。这是可以按[ctrl+z],把当前程序切入后台。
但是要注意此时在后台的这个程序是处于 Stopped 状态
要继续执行的话,先使用jobs命令找出当前任务的jobId,然后按如下操作

1
[root@localhost cdnjs]#bg 1

后台切回前台

先使用jobs命令找出当前任务的jobId,然后按如下操作

1
[root@localhost cdnjs]#fg 1

nohup

不管是前台进程还是后台进程,在终端关闭的时候,linux会发出终端关闭信号,让在终端中运行的进程结束。
但是,我们可能会有这样的需求:
在linux进行下载很久的任务,但是终端关闭的时候,我们是不希望下载被终止的。所以,可以采用nohup命令的方式,让程序运行的时候,忽略掉终端关闭的信号。
格式为:

1
nohup 执行程序的命令

tip

如果想让一个程序在后台运行,只要在执行命令的末尾加上一个&符号就可以了。但是这种方式不是很保险,有些程序当你登出终端后它就会停止。那么如何让一个程序真正永远在后台执行呢。答案就是使用 nohup和&组合使用
格式为:

1
nohup 执行程序的命令 &

screen

nohup和&的缺点是,如果你要在一个shell会话里面执行多个命令和脚本,那么要每个命令和脚本都要加nohup和&非常麻烦,所以才有了screen。

1
screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s <shell>][-S <作业名称>]
1
2
3
4
5
6
7
8
9
10
11
12
-A 					   		   将所有的视窗都调整为目前终端机的大小。
-d<作业名称>   将指定的screen作业离线。
-h<行数>   指定视窗的缓冲区行数。
-m   即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r<作业名称>   恢复离线的screen作业。
-R   先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s<shell>  指定建立新视窗时,所要执行的shell。
-S<作业名称>   指定screen作业的名称。
-v   显示版本信息。
-x   恢复之前离线的screen作业。
-ls或--list   显示目前所有的screen作业。
-wipe   检查目前所有的screen作业,并删除已经无法使用的screen作业。

1、常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
screen -ls              # 查看所有screen
screen -S <screen-name> # 创建screen,并命名
ctr + A, D # 快捷键,退出当前screen
screen -r <screen-name> # 进入screen
screen -X quit # 删除screen,但没有指定会话
screen -X -S [session you want to kill] quit #删除screen,指定会话
screen -wipe # 清除dead screens

screen -S yourname # 新建一个叫yourname的session
screen -ls # 列出当前所有的session
screen -r yourname # 回到yourname这个session
screen -d yourname # 远程detach某个session # detach快捷键 ctrl a + d
screen -d -r yourname # 结束当前session并回到yourname这个session
screen -S yourname -X quit # 删除叫yourname的session

2、快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 默认的 command key 是 ctrl+a
escape `` #指定command key 为 `,并指定在按下 ` 后再按 `,相当于之前 C-a a 的效果
C-a ? #列出当前可用快捷键及其对应的命令
C-a : #进入命令输入模式,之后可输入并执行screen中的命令,比如quit强制关闭当前screen,比如split分屏
C-a d #使当前session处于Detached状态
C-a :quit #关闭当前会话
C-a c #新建窗口
C-a K #强制关闭当前窗口
C-a \" #显示当前会话的窗口列表,用j、k上下移动光标选择窗口,或直接用0-9选择窗口
C-a \' #输入窗口序号或title,选择指定窗口
C-a 0-9 #选择指定窗口
C-a n #选择下一个窗口
C-a [space] #选择下一个窗口
C-a p #选择上一个窗口
C-a C-a #移动到上一次选择的窗口
C-a A #修改当前窗口的title
C-a [ #进入复制模式。
C-a ] #将buffer中的内容粘贴出来,退出复制模式。vim 中最好是在insert模式下。

管理

查看运行的后台进程

(1)jobs -l

img

jobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)

(2)ps -ef

1
2
3
4
ps -aux|grep chat.js
a:显示所有程序
u:以用户为主的格式来显示
x:显示所有程序,不以终端机来区分

img

注:

  用ps -def | grep查找进程很方便,最后一行总是会grep自己

  用grep -v参数可以将grep命令排除掉

1
ps -aux|grep chat.js| grep -v grep

img

  再用awk提取一下进程ID 

1
ps -aux|grep chat.js| grep -v grep | awk ``'{print $2}'

img

3.如果某个进程起不来,可能是某个端口被占用

查看使用某端口的进程

1
lsof -i:8090

img

1
netstat -ap|grep 8090

img

查看到进程id之后,使用netstat命令查看其占用的端口

1
netstat -nap|grep 7779

img

使用kill杀掉进城后再启动

4.终止后台运行的进程

1
kill -9 进程号

img