Linux服务器生产环境中的文件删除与替换

在Linux运维中经常遇到要替换Linux服务器系统程序或者业务应用程序文件的情况,很多人都会担心,直接替换会不会导致Linux系统程序崩溃或者应用程序崩溃,而需要关闭服务才敢替换,今天在freebuf网站偶然阅读到一篇文章《如何进行Linux平台共享库替换》,突然明白了以前没有搞清楚的几个自认为“奇怪”的现象。

这些现象包括但不限于:

  1. 删除某个应用程序的部分文件,为何不会导致此应用程序崩溃
  2. nginx等服务如何可以做到平滑重启
  3. 某些删除的文件为何可以通过lsof根据inode找回
  4. 为何某些应用程序的文件替换或变更后需要重启才能生效

问题的答案在这篇文章中得到了很清楚的解答。原来(下面文字为直接引用),

针对未被加载的SO,利用复制命令(cp new.so old.so)即可直接完成静态替换,新SO在下次加载时生效。对于已经加载的原SO,直接用新SO复制替换将会导致相应程序崩溃,此种情况可以使用删除原SO(rm -f old.so)或修改原SO名称(mv old.so oldx.so)后,再复制新SO的方法代替,新SO同样在下次加载时生效。

程序崩溃的原因是复制替换操作会破坏系统访问原SO的索引节点inode,导致系统找不到原SO。系统为每个加载到内存中的文件创建对应的inode,用来管理该文件,inode包含了文件的元信息,如文件字节数、拥有者ID、读写执行权限等。系统以inode标识程 序加载的SO,不再关心文件名,修改SO名称并未改变对应inode,因此程序可以继续正常运行;删除SO只是无法查看,系统直到程序释放SO后才真正删除SO和inode,因此程序也可以继续正常运行;但是在直接复制替换时,新SO将会继承原SO的inode,程序无法继续访问原SO,从而导致程序崩溃。

因此,按照这个思路,日后在Linux运维工作中,可以按照这个理论去做一些事情,比如无论是在修改还是替换钱都保留源文件,这也是为什么在做修改前要备份的理由之一。

参考文章:如何进行Linux平台共享库替换

tag:生产环境,文件删除,文件替换,如何上线,操作标准

--end--

时间: 2024-10-13 11:01:45

Linux服务器生产环境中的文件删除与替换的相关文章

生产环境中的PHP WEB 简单架构

使用三台虚拟机器, Ubuntu1(nginx) 192.168.226.128 Ubuntu2(php-fpm+memcached)192.168.226.132 CentOS(MySQL)192.169.226.130 PHP 框架使用CakePHP,这个是很常用的MVC 框架,基于事件的分发模型 当然需要注意的是框架代码要部署在php-fpm机器上,需要在nginx 中配置的配置如下 余下的内容: 1. CakePHP 框架代码 2. PHP 内核 3. Nginx内核 4. 数据库设计模

.NET跨平台之旅:生产环境中第2个跑在Linux上的ASP.NET Core站点

今天我们在生产环境中上线了第2个跑在Linux上的ASP.NET Core站点.这是一个简单的Web API站点,通过命令行的方式调用安装在Linux服务器上的程序完成操作.之前用的是nodejs,现在换成了ASP.NET Core,主要代码如下: var psi = new ProcessStartInfo(command, arguments) { RedirectStandardOutput = true, RedirectStandardInput = true, CreateNoWin

.NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点

2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上用V2015开发的,以self-contained应用部署方式发布到Linux服务器.Linux服务器用的是Ubuntu 14.04,站点通过supervisor以服务方式运行,部署在2台阿里云服务器上,用了1台阿里云内网负载均衡. 虽然是很简单的站点,虽然是很小的一步,但是进入生产环境就意味着对性

在生产环境中安全执行更新删除SQL脚本的技巧

今天在生产环境上解决问题,由于广发银行的管理制度是开发公司是不允许确生产环境的,所以我们只能把要更新的语句发给运营中心,由运营中心的投产人员执行,我们则在旁边看着:在他执行的时候发现了一个很有趣的技巧,现在分享出来. 我们知道每一次在生产环境中执行中执行更新删除语句的时候都要格外小心,要做好数据备份,但是即便这样对于一个做了分库分表设计,有十几个G的库来说更新一句SQL后发现忘记写WHERE语句或是语句写错了,恢复备份的成本都是相当高的. 我注意到运营中心的人在拿到我的SQL语句后,把它放到MS

生产环境中tomcat的配置

生产环境中要以daemon方式运行tomcat 通常在开发环境中,我们使用$CATALINA_HOME/bin/startup.sh来启动tomcat, 使用$CATALINA_HOME/bin/shutdown.sh来关闭tomcat. 而在生产环境中,我们要配置tomcat使其以daemon方式运行,这是因为: 以daemon运行不受终端影响,不会因为退出终端而停止运行 可以让tomcat以普通用户身份运行,可以让tomcat随linux启动而启动 如何将tomcat配置成守护进程 将tom

生产环境中CentOS7部署NET Core应用程序

NET Core应用程序部署至生产环境中(CentOS7) 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. 部署ASP.NET Core应用程序 配置Nginx 配置守护服务(Supervisor) 这段时间在使用Rabbit RPC重构公司的一套系统(微信相关),而最近相关检验(逻辑测试.压力测试)已经完成,接近部署至线上生产环境从而捣鼓了ASP.NET Core应用程序在CentOS上的部署方案,今天

Confluence 6 从生产环境中恢复一个测试实例

请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明. 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 Confluence 服务器,同时还会设置一个测试实例来测试升级等.在这种情况下,你的 Confluence 可以回运行 2 个不同的版本,而且也是非常常见的.这个文档将会知道你如何拷贝生产环境中的数据到一个测试实例中,同时测试环境的版本和生产环境中的版本还有可能是不同的. 在开始这个操作指南之前,

Linux 服务器 Java环境部署系列(五):搭建RabbitMQ

引言 本文主要介绍Linux服务器下,搭建RabbitMQ,及相关配置. 系列文档目录 Linux 服务器 Java环境部署系列(一):安装JDK Linux 服务器 Java环境部署系列(二):安装nginx.mysql.tomcat.redis Linux 服务器 Java环境部署系列(三):安装git.maven Linux 服务器 Java环境部署系列(四):搭建jenkins环境.部署项目 Linux 服务器 Java环境部署系列(五):搭建RabbitMQ 准备工作 下载Erlang

理解Docker(6):若干企业生产环境中的容器网络方案

本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 Docker 在早期只有单机上的网络解决方案,在 1.19 版本引入了原生的 overlay 网络解决方案,但是它的性能损耗较大,可能无法适应一些生产环