关于Linux执行文件操作,断电后数据丢失问题

2024-03-10 03:38

本文主要是介绍关于Linux执行文件操作,断电后数据丢失问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

  在Debian下,批量执行cp命令后,机子立马断电(arm板),开机后发现文件大小都变为了0。但如果是过一会儿再断电,文件大小就正常。神奇的地方就在这边,我cp的文件里头有可执行文件,cp执行完是可以启动的,断电后反而打不开了,所以这个问题困扰了我很久。

原因

  linux这边读写文件都是优先在cache里面的,也就是cache/buffer的机制。当回写进程触发,或者脏数据超时(简单来说就是满足条件触发回写),缓存才会开始把数据写到IO。也就是说执行完cp后,如果有空闲的内存,那么就会默认写到内存里头,如果断电时候,回写没有触发,数据就全部丢失了。

解决方法

一、
  执行完cp后,调用sync命令。但是sync也只是告诉系统要开始写IO而已,实际还是异步,所以还是得等。所以可以调用sync后,执行sleep,不过sleep的度不好把控,要根据实际情况自己推算。
  如果是大文件的话,可以大文件拆分来写,但也只能解决燃眉之急,如果是arm这种随时断电的机子,还是没法解决。

二、
  linux后台有守护进程每隔一段时间执行一次sync,那么可以修改或者说缩短sync时间,通过多写来确保数据安全。或者也可以减小cache,让sync的条件更容易触发,来解决这个问题。两个本质上都是提高系统从cache到IO的频率。(第二点瞎掰的,应该要改内核)

三、
  个人比较倾向这种。通过fflush和fsync来实现。

Created with Raphaël 2.3.0 打开文件 write执行写文件 fflush刷新到cache fsync刷新到IO 结束

因为fsync是同步的,会等到写磁盘成功才返回。但是这样的话,时间的损耗就比较大。不过要像马儿跑得快,又不给马儿吃草是不存在的。

结束

上面一、三点在我看来是可行的,目前自己做法采取了第一种(懒得写太多东西)。若文章有错误,或者有更好的方式实现,欢迎评论指出。
在这里插入图片描述

后续

2023年5月23日更新

  无意间看到自己当初写的文章,觉得还有点不足,这里补充下:

  • 这种很随机的断电操作其实是很致命的,你无法保证关机的时候IO已经结束,个人认为硬件方面加个断电保护才是最可靠有效的。
  • 如果没做断电保护,可以每次写的时候先写一次备份,备份写完再COPY到主文件。这样就算断电数据丢失,也能保证主文件和备份至少有一个数据是完整的(只是不能保证数据一定是最新的)。在业务允许的情况下(允许数据不一定要最新),这个方法我觉得反而是最简单有效的。

这篇关于关于Linux执行文件操作,断电后数据丢失问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792905

相关文章

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序