Linux学习之后台运行进程

前言

有的时候我们希望Linux的命令行能运行一个程序,然后把它放在后台,让其自己运行,尤其是云服务器运行单线程程序,TCP服务器开启一个while(true)循环监听一个端口,这时命令行就死在那等着,我们想像Windows那样,把它"最小化",放在后台让其自己玩。主要介绍3种方法,以下方法均在服务器和虚拟主机中实现。
服务器
运行环境:阿里云服务器 ECS 2核2 GiB
操作系统:Ubuntu 20.04 64位
网络带宽:1Mbps

虚拟主机
主机:联想Y7000P;64位windows10;CPU:i7-9750H;显卡:GTX 1660 Ti;内存:16G
虚拟机:Ubuntu 18.04 LTS;硬盘100G;内存4G;64位;4核心
Linux内核:5.11.8

本文原创,创作不易,转载请注明!!!
本文链接
个人博客:https://ronglin.fun/?p=165
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/116009949

准备工作

我们先来一个程序让其运行,我用的是Python中的socket 服务器示例代码,它是一个while(true),阻塞式等待客户端的连接。
代码来自:Python3 网络编程
这是源码:

#!/usr/bin/python3
# 文件名:server.py

# 导入 socket、sys 模块
import socket
import sys

# 创建 socket 对象
serversocket = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM) 

# 获取本地主机名
host = socket.gethostname()

port = 59999

# 绑定端口号
serversocket.bind((host, port))

# 设置最大连接数,超过后排队
serversocket.listen(5)
print("等待客户端连接")
while True:
    # 建立客户端连接
    clientsocket,addr = serversocket.accept()      

    print("连接地址: %s" % str(addr))
    
    msg='测试成功'+ "\r\n"
    clientsocket.send(msg.encode('utf-8'))
    clientsocket.close()

先看直接运行的效果
Linux学习之后台运行进程_第1张图片
可以看到,命令行一直阻塞在这里,等待客户端的连接,要想继续用此终端,只能Ctrl+C强制关闭这个程序,所以需要让其后台运行。

“&” 字符

本方法参考自:
快乐的 Linux 命令行
http://billie66.github.io/TLCL/
P128 11.6 把一个进程放置到后台 (执行)部分

启动任务

为了启动一个程序并让它立即在后台运行,我们在程序命令之后,加上 “&” 字符,如图,执行命令之后,程序运行的提示信息出现,并且 shell 提示符返回,同时打印一些有趣的数字。这条信息是 shell 特性的一部分,叫做任务控制 (job control)。通过这条信息,shell 告诉我们,
已经启动了任务号 (job number) 为 1(“[1]”),PID 为 14974 的程序。如果运行 ps 命令,
可以看到运行的进程,我这里有3个其中python3就是服务器在后台运行。
Linux学习之后台运行进程_第2张图片
shell 的任务控制功能给出了一种列出从我们终端中启动了的任务的方法。执行 jobs 命令,
我们可以看到上图这个输出列表,结果显示我们有一个任务,编号为“1”,它正在运行,并且这个任务的命令是python3 serverDemo.py &。这时就可以用客户端去连接了,而且这个终端还可以继续用。

切换任务

一个在后台运行的进程对一切来自键盘的输入都免疫,也不能用 Ctrl-c 来中断它。为了让一个
进程返回前台 (foreground),这样使用 fg 命令:
Linux学习之后台运行进程_第3张图片
fg 命令之后,跟随着一个百分号和任务序号(叫做 jobspec, 如此处的%1)就可以了。如
果我们只有一个后台任务,那么 jobspec(job specification) 是可有可无的。这样就把任务切换到了前台了。
这时我们就可以继续操作启动的那个进程了。

结束任务

结束任务可以用万能的Ctrl+C,结束任务。
先把后台的进程用fg %序号,切换到前排,然后输入Ctrl+C就可以结束进程了。

以上命令均在阿里云服务器上运行成功!!!

screen命令

参考资料:Linux screen命令
screen指令结构:

screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

我常用的就是:

-d<作业名称>    将指定的screen作业离线
-r<作业名称>    恢复离线的screen作业
-ls或--list    显示目前所有的screen作业。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业
-S <作业名称> 指定screen作业的名称。注意在-S后面的""中需要填写英文的名字用于返回终端

安装screen

下面先在虚拟机Ubuntu下运行一下基本的
输入screen -v,看一下是否安装了srceen指令。
Linux学习之后台运行进程_第4张图片
没有,输入

sudo apt install screen

然后等待其自己安装完,安装完之后,输入screen -v查看结果
在这里插入图片描述
如果输入install指令提示没找到,可以尝试更新一下系统的镜像源,如果是云服务器,可以输入sudo apt update直接更新

创建任务

输入screen -S "Pythonserver" python3 serverDemo.py
创建一个作业,名称为"Pythonserver",后边接的是要运行的指令。然后屏幕就会跳转到"Pythonserver"中,如果想要返回终端中,按下Ctrl+A,然后都松开,然后再按下D键就行了。
在这里插入图片描述
如果不想弹出来,而是想直接让其再后台运行,可以在-S前加上-d和-m的参数,让其直接在后台挂起,例如:
screen -d -m -S "Pythonserver" python3 serverDemo.py

切换任务

可以输入screen -ls来查看当前screen运行的任务列表,然后用

screen -r "任务名称"
或者
screen -r 序号

切换到任务
Linux学习之后台运行进程_第5张图片
如果是用名字输入的话,要加上双引号,用序号的话不用,序号就是名称前的
切换回来也是一样的,按下Ctrl+A,然后都松开,然后再按下D键

结束任务

可以先用screen -r 序号切换到任务中,然后,按下Ctrl+C,强制结束任务
也可以在终端中输入kill 序号强制结束任务
Linux学习之后台运行进程_第6张图片

以上命令均在阿里云服务器上运行成功!!!

tmux命令

参考资料:Tmux 使用教程

Tmux 是一个终端复用器(terminal multiplexer),看一下资料中提到的tmux作用,如有侵权,请联系我删除!
Linux学习之后台运行进程_第7张图片

安装tmux

先输入tmux,看本机是否安装了tmux
Linux学习之后台运行进程_第8张图片
看来没有,然后输入

sudo apt install tmux

等待其安装完就行了。

启动tmux

在终端中,输入tmux就行了
Linux学习之后台运行进程_第9张图片
底部是状态栏,左侧是窗口编号,右侧是系统的信息。
按下Ctrl+D或者输入exit,就可以退出 Tmux 窗口。

前缀快捷键

Tmux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是Ctrl+B,即先按下Ctrl+B,快捷键才会生效。
举例来说,帮助命令的快捷键是Ctrl+b ?
它的用法是,在 Tmux 窗口中,先按下Ctrl+b,再按下?,就会显示帮助信息。
然后,按下 ESC 键或q键,就可以退出帮助。

启动任务

第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。
有的时候使用编号区分会话,不太直观,更好的方法是为会话起名。

tmux new -s 

上面命令新建一个指定名称的会话。

然后就是在后台挂起进程终端。
在 Tmux 窗口中,按下Ctrl+B,松开,然后按下D键 或者 输入tmux detach命令,就会将当前会话与窗口分离,就会退出当前 tmux 窗口,但是所运行的tmux不会结束,会挂在后台

切换任务

启动之后,返回系统终端之后,可以输入tmux ls查看当前挂在后台的tmux窗口。
在这里插入图片描述
如果想要从系统终端返回到tmux界面,输入

tmux attach -t 序号
或者
tmux attach -t 

就可以切换回对应的tmux界面了。
如果是已经在tmux界面中,想要切换到其他tmux界面中,可以输入

tmux switch -t 序号
或者
tmux switch -t 

就可以在不同的tmux窗口中切换了。

如果想要换名字可以用tmux rename-session命令用于重命名会话。

tmux rename-session -t 序号 

结束任务

结束任务可以在想要结束tmux中输入exit指令,或者按下Ctrl+D。
如果是在系统终端中,可以用tmux kill-session指令删除tmux窗口

tmux kill-session -t 0
或者
tmux kill-session -t 

以上命令均在阿里云服务器上运行成功!!!

其实tmux还有很多很多便利的快捷键和便捷的多窗口操作方式,具体的在上方的参考资料里都有,有需要的可以自行查询。

总结

其实,对于虚拟机中的Ubuntu系统下,貌似多任务模式意义不大,因为Ubuntu的终端是有最小化的按钮的,而且还可以直接打开多个终端。
然后在云服务器中,虽然只有终端界面,但是也可以开启多个终端,不过还是要掌握一下,把程序挂起在后台,让其自己运行的方法,尤其是对于一些单线程的程序。 =w=

你可能感兴趣的:(Linux,linux,ubuntu)