5月份时曾部署上线了C++的Web服务器,温故而知新,本篇文章梳理总结一下部署流程知识;
以下是本文的大概内容思维导图:
一、最初的解决方案
原理:
当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号 ,要么让进程运行在新的会话里从而成为不属于此终端的子进程。
方法1:进程忽略HUP信号
命令:
nohup (no hang up,不挂起):用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
使用:
bash
nohup ./IM_chat >> IMchat.log 2>&1 &
- ./IM_chat : 当前文件目录下的新坑项目可执行文件
- >> IMchat.log 2>&1: 将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 IMchat.log 文件中
- & : 让命令在后台执行,终端退出后命令仍旧执行
其他知识:
1、Linux中的0、1、2: 0是standard input,标准输入,1是standard output,标准输出,2是standard error,标准错误输出
2、停止运行进程的方法:
ps -aux | grep "IM_chat"
Kill - 9 进程号PID
AI回答版知识:
在Linux中,0、1、2是特殊文件描述符,用于表示标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。它们在I/O重定向和管道操作中起着重要的作用。
- 标准输入(stdin):文件描述符0,通常与键盘输入相关联。当程序需要从用户获取输入时,可以读取标准输入流来接收用户的输入数据。例如,通过命令行输入或从终端读取数据。
- 标准输出(stdout):文件描述符1,通常与显示器相关联。当程序产生输出时,默认会将输出内容发送到标准输出流,并在终端上显示。可以通过重定向操作将标准输出流重定向到文件,以便将输出保存在文件中。
- 标准错误(stderr):文件描述符2,通常也与显示器相关联。与标准输出类似,但标准错误流用于输出错误和警告消息,而不是正常的程序输出。通常,错误消息会直接打印到终端上,而不受标准输出重定向的影响。
这些概念涉及到Linux的输入输出(I/O)机制和文件描述符的概念:
- 输入输出(I/O):指计算机系统与外部设备之间的数据交换过程。在Linux中,输入可以来自键盘、文件或其他进程的输出。输出可以显示在终端、写入文件或发送给其他进程。
- 文件描述符:在Linux中,每个打开的文件(包括设备和管道)都与一个唯一的整数标识符相关联,称为文件描述符。0、1和2是预定义的文件描述符,分别对应标准输入、标准输出和标准错误。
- I/O重定向:通过重定向操作,可以改变程序默认的输入或输出位置。使用特殊的符号(如<、>和>>)将输入/输出从一个源/目标指向另一个源/目标。例如,将命令的输出重定向到文件,或从文件中读取输入而不是键盘。
- 管道操作:管道允许将一个进程的输出直接传递给另一个进程的输入,以实现进程间通信。通过使用|符号,可以将一个命令的输出连接到另一个命令的输入,形成一个管道链。
这些机制使得在Linux系统中可以方便地控制输入和输出流,以及处理输入输出的重定向和管道操作,从而增强了程序的灵活性和可扩展性。
方法2:进程运行在新会话
服务跑起来后,过了段时间访问自己的写的webserver服务器里放的个人主页页面发现竟然挂了!于是检查日志没发现啥问题,于是尝试让进程运行在新会话的方法;
screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。如果有大量命令需要在稳定的后台里运行,可以避免对每条命令都做这样的操作;
bash
yum -y install screen # 安装screen
screen -dmS sessionname # 建立一个处于断开模式下的会话,sessionname可更改为自己的服务名
screen -list # 列出所有会话,查看是否建立会话
screen -r sessionname # 重新连接指定会话,运行自己的服务
用快捷键CTRL + a + d 来暂时断开当前会话。退出终端连接,查看服务是否稳定运行
本次最初方案即srceen中组合nohup加上&的组合拳,终极版还能加上systemctl配置开机自启!的参考文章:
- https://www.linuxprobe.com/process-run-in-background.html
- https://blog.csdn.net/Pan_peter/article/details/128875714
二、后来的解决方案
平稳运行大概大半个月后,偶然发现服务又挂了,不能忍了个人主页谁天天看在不在运行啊!直接上脚本每一段时间自动检测一下服务是否运行中,没运行的话就重启一下!(以下脚本可自己定义去修改,非正式使用脚本)
bash
#!/bin/sh
while true
do
ps -ef | grep "temporaryfile" | grep -v "grep"
#查找系统中含有"temporaryfile"字符的进程,并且排除grep本身的进程。
if [ "$?" -eq 1 ]
#如果未运行
then
python3 /home/xxx/xxxxxx.py
#启动应用,修改成自己的启动应用脚本或命令
echo "process has been restarted!"
else
echo "process already started!"
fi
sleep 60
done
参考文章:https://zhuanlan.zhihu.com/p/599421452
三、最后的思考
虽然脚本的办法挺不错的,服务一直运行到今天2023/9/3都没有挂过,但是不由得思考两个问题
1、最开始的webserver服务为什么会挂掉?看日志也没有分析出原因
2、大型企业的后台服务是怎样运行维护的呢?不至于我这样一个一个的手动启动和查进程关闭或者使用脚本吧
ai回答:
大型公司的后台Linux部署通常采用更为复杂和全面的解决方案。这些解决方案可能包括:
- 容器化技术:使用容器技术(如Docker)将应用程序和其依赖项打包成可移植的容器镜像,从而实现隔离和可扩展性。
- 自动化部署:使用自动化工具(如Ansible、Chef或Puppet)来管理和部署服务器和应用程序,实现快速、可靠的部署过程。
- 高可用性和负载均衡:使用负载均衡器和集群管理工具,确保系统的高可用性和可扩展性。
- 日志和监控:使用日志记录和监控工具(如ELK堆栈、Prometheus、Grafana等)来收集、分析和监视系统的运行情况,以及进行故障排除和性能优化。
服务挂掉的原因由于时间久远(大概几个月前)很难追溯了,但是第二个问题却是可以继续推动无限进步!
1、Docker技术: 看完了w3c教程成功入门并用其搭建vulhub靶场过;https://www.w3cschool.cn/docker/docker-command-manual.html
2、自动化部署工具: K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,这个看来得学学了;
3、负载均衡和高可用 : 负载均衡集群--知乎,打开新世界大门原来负载均衡技术的实现除了我知道的nginx软件技术以外还有硬件技术的实现;
4、日志和监控工具 :Elastic Stack(Elasticsearch Logstash 和 Kibana)
Elastic Stack,通常缩写为ELK,是一种流行的三合一日志集中、解析和可视化工具,可将来自多台服务器的大量数据和日志集中到一台服务器中。
ELK Stack 包含 3 种不同的产品:
Logstash
Logstash是一个免费的开源数据管道,它收集日志和事件数据,甚至处理数据并将其转换为所需的输出。使用名为" beats "的代理将数据从远程服务器发送到logstash。" beats "将大量系统指标和日志发送到Logstash,然后对其进行处理。然后它将数据提供给Elasticsearch。
弹性搜索
Elasticsearch基于Apache Lucene构建,是一个开源分布式搜索和分析引擎,适用于几乎所有类型的数据------包括结构化和非结构化数据。这包括文本、数字和地理空间数据。
它于 2010 年首次发布。Elasticsearch是ELK堆栈的核心组件,以其速度、可扩展性和 REST API 着称。它存储、索引和分析从Logstash传递的大量数据。
Kibana
数据最终传递给Kibana,这是一个与Elasticsearch一起运行的 WebUI 可视化平台。Kibana允许您探索和可视化来自 elasticsearch 的时间序列数据和日志。它在直观的仪表板上可视化数据和日志,这些仪表板采用各种形式,例如条形图、饼图、直方图等。
要学的东西还有很多啊,无限进步! 以下是一些参考文章。
参考文章: