前言

有的时候我们希望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()

先看直接运行的效果

可以看到,命令行一直阻塞在这里,等待客户端的连接,要想继续用此终端,只能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就是服务器在后台运行。

shell 的任务控制功能给出了一种列出从我们终端中启动了的任务的方法。执行 jobs 命令,
我们可以看到上图这个输出列表,结果显示我们有一个任务,编号为“1”,它正在运行,并且这个任务的命令是python3 serverDemo.py &。这时就可以用客户端去连接了,而且这个终端还可以继续用。

切换任务

一个在后台运行的进程对一切来自键盘的输入都免疫,也不能用 Ctrl-c 来中断它。为了让一个
进程返回前台 (foreground),这样使用 fg 命令:

fg 命令之后,跟随着一个百分号和任务序号(叫做 jobspec, 如此处的%1)就可以了。如
果我们只有一个后台任务,那么 jobspec(job specification) 是可有可无的。这样就把任务切换到了前台了。
这时我们就可以继续操作启动的那个进程了。

结束任务

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

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

screen命令

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

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

我常用的就是:

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

安装screen

下面先在虚拟机Ubuntu下运行一下基本的
输入screen -v,看一下是否安装了srceen指令。

没有,输入

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 序号

切换到任务

如果是用名字输入的话,要加上双引号,用序号的话不用,序号就是名称前的
切换回来也是一样的,按下Ctrl+A,然后都松开,然后再按下D键

结束任务

可以先用screen -r 序号切换到任务中,然后,按下Ctrl+C,强制结束任务
也可以在终端中输入kill 序号强制结束任务

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

tmux命令

参考资料:Tmux 使用教程

Tmux 是一个终端复用器(terminal multiplexer),看一下资料中提到的tmux作用,如有侵权,请联系我删除!

安装tmux

先输入tmux,看本机是否安装了tmux

看来没有,然后输入

sudo apt install tmux

等待其安装完就行了。

启动tmux

在终端中,输入tmux就行了

底部是状态栏,左侧是窗口编号,右侧是系统的信息。
按下Ctrl+D或者输入exit,就可以退出 Tmux 窗口。

前缀快捷键

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

启动任务

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

tmux new -s <session-name>

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

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

切换任务

启动之后,返回系统终端之后,可以输入tmux ls查看当前挂在后台的tmux窗口。

如果想要从系统终端返回到tmux界面,输入

tmux attach -t 序号
或者
tmux attach -t <session-name>

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

tmux switch -t 序号
或者
tmux switch -t <session-name>

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

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

tmux rename-session -t 序号 <new-name>

结束任务

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

tmux kill-session -t 0
或者
tmux kill-session -t <session-name>

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

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

总结

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

Linux学习之后台运行进程相关推荐

  1. Linux nohup实现后台运行程序及查看(nohup与)

    Linux nohup实现后台运行程序及查看(nohup与&) 更新时间:2019年09月11日 09:28:40 作者:猿的生活 这篇文章主要介绍了Linux nohup实现后台运行程序及查 ...

  2. 暴风影音去广告链接和后台运行进程

    由暴风影音引起的大规模DNS故障过去不久,想必大家对此还记忆犹新,本身暴风影音是大家以前蛮喜欢的一款播放软件,但由于广告的不但添加.留有后台进程,加上这次的网络门事件,都有点不敢用它了,但其出色的解码 ...

  3. linux shell 在后台运行命令

    linux shell 在后台运行命令: http://blog.csdn.net/CAIYUNFREEDOM/article/details/6339390 http://blog.sina.com ...

  4. Linux中vue后台运行

    Linux中vue后台运行 只会简单的尝试 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设 ...

  5. Linux系统中后台运行java项目jar包指令

    Linux系统中后台运行java项目jar包指令 windows环境下后台运行jar包程序: https://blog.csdn.net/qq_36763419/article/details/109 ...

  6. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务

    1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...

  7. Linux后台运行进程

    最近在搭建kafka的过程中,发现启动相关服务后,终端界面无法再进行操作.每次都需要开启多个终端界面,实在是特别麻烦.于是就研究了下Linux后台启动程序的方法,并整理了如下的笔记. 1 后台运行的例 ...

  8. linux 退出终端仍运行进程 日志输出,后台执行任务,不在终端打印信息

    &命令: xxx >/dev/null 2>&1 &                           屏蔽一切logxxx >/tmp/xxx.log 2 ...

  9. linux java后台运行_Java程序在Linux中实现后台运行

    1.运行脚本 脚本如下,这个脚本存在一点问题,Log4j稍微有点问题,但是对运行及日志记录没有影响,日志是通过将所有控制台数据全部写入文件的形式记录的. #!/bin/sh #author:wangc ...

最新文章

  1. 构建一个react项目_您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩。...
  2. java读取服务器图片大小,SpringMVC中MultipartFile上传获取图片的宽度和高度详解
  3. (0057)iOS开发之Xcode9进行iOS设备无线调试
  4. 洛谷P1330 封锁阳光大学
  5. 1.2.2 时间复杂度
  6. java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
  7. .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法
  8. python 文件和目录 当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
  9. MVC 模式和模型 2
  10. Firefly推出了小型高性能嵌入式主机
  11. Git commit至Gitee报错‘remote: error: hook declined to update refs/heads/master‘的解决方法
  12. 如何理解 Spring AOP 以及使用 AspectJ?
  13. matlab线性代数命令大全,线性代数 - MATLAB 系统中文帮助手册
  14. Set,List,Map,Vector,ArrayList的区别
  15. centos6.8下安装dc2012
  16. mysql 向量写法_mysql – 你如何在Ruby中处理一个非常大的向量?
  17. PreferenceScreen 悬浮清除按钮
  18. x86 android armv7,说说Android项目中的armeabi,armeabi-v7a和x86
  19. 怎么测量标准工时,实用分享:几种标准工时的测量方法
  20. Spring Boot + Thymeleaf + Echarts 三维地图展示

热门文章

  1. 《构建之法》第十三章学习总结
  2. 《Java并发性和多线程介绍》-Java TheadLocal
  3. Liferay 控制面板在指定文件夹添加Basic Document流程分析
  4. android每日一问【2011-8-26】
  5. [转贴]非技术:在广州天河北被抢全记录(入面D广州话真系厉害,不懂粤语者别看,会吐血)...
  6. vm8中装了redhat9 在安装vmwaretools的时候老是出现gcc位置错误
  7. 数字化转型时代,企业管理者应该如何培养数据化管理思维?
  8. 5招训练你的数据敏感度,数据高手都在用
  9. 飞鸽传书不能用?这里列出所有解决方法!
  10. 后续的C++测试并不一定会成功