Linux sed行删除是原子的吗?

Linux sed行删除是原子的吗?,linux,multithreading,shell,sed,Linux,Multithreading,Shell,Sed,假设我有一个文件“队列”。据我所知,使用“>>”进行附加是POSIX定义的原子。但是,如果我有多个附加进程,那么在不丢失数据的情况下执行以下操作安全吗 sed-e'1d'-i队列 我在Linux上有几个不同的脚本服务,它们可能希望在它们之间传递信息。每个都有一个“队列”,其中新数据被推到底部,下一项从顶部弹出 在将文件读取到缓冲区和将其写入磁盘之间,是否保证使用sed不会错过另一个进程的追加操作 谢谢。我会听从任何提出更有力要求的人,但我认为这样做不安全 -I/COD>通过复制文件的临时副本,然

假设我有一个文件“队列”。据我所知,使用“>>”进行附加是POSIX定义的原子。但是,如果我有多个附加进程,那么在不丢失数据的情况下执行以下操作安全吗

sed-e'1d'-i队列

我在Linux上有几个不同的脚本服务,它们可能希望在它们之间传递信息。每个都有一个“队列”,其中新数据被推到底部,下一项从顶部弹出

在将文件读取到缓冲区和将其写入磁盘之间,是否保证使用sed不会错过另一个进程的追加操作


谢谢。

我会听从任何提出更有力要求的人,但我认为这样做不安全<代码> -I/COD>通过复制文件的临时副本,然后将其移回原位,以替换中间的任何附加更改。 资料来源:

-i[后缀] --就地[=后缀] 此选项指定要在位编辑的文件。GNU sed通过创建一个临时文件并将输出发送到此文件而不是标准输出来实现这一点。1。 这个选项意味着-s

到达文件末尾时,临时文件将重命名为输出文件的原始名称。扩展名(如果提供)用于在重命名临时文件之前修改旧文件的名称,从而生成备份副本(2)

遵循以下规则:如果扩展名不包含*,则将其作为后缀附加到当前文件名的末尾;如果扩展名包含一个或多个*字符,则每个星号将替换为当前文件名。这允许您向备份文件添加前缀,而不是后缀(或附加后缀),甚至可以将原始文件的备份副本放置到另一个目录中(前提是该目录已存在)

如果未提供扩展名,则会覆盖原始文件而不进行备份


我会让其他聪明的人告诉你答案,但如果没有,你可以在
sed
命令前面使用
sem
from
GNU Parallel
作为互斥,以确保一次只运行一个…有趣。我不知道sem计划。这并不能回答你所说的问题,但我学到了一些新东西,并投票支持你。你确定该程序名为
sem
?我运行RHEL7,并且
yum-whatprovides-sem
不会返回结果。在我的Mac电脑上,它是指向
parallel
的硬链接。使用
>
完全不是原子的。小于一定大小的写入是原子性的,但写入文件的程序可能会进行块缓冲,并且可能会将写入延迟到4096或8192字节,并且极有可能块边界不会与行对齐(即,写入的最后一个字节不会是换行符),如果另一个进程同时在写,写操作将拆分行。这是真的
sed-i
绝对不是原子的。对于较大的文件,关键部分甚至可能需要几分钟或几小时。