打开正在运行的脚本编写的文件是否安全?


20

我正在运行正在写入文件的Shell脚本。
该脚本可能需要很长时间才能完成,我想监视部分输出,而不是等待整个脚本完成。

打开(双击)脚本正在写入的文件是否安全?


4
那。另外,如果您事先知道,则可以通过tee通过管道输出脚本。
汉尼斯,

1
半相关的是tee突击队:您可以将输出同时转发到某个文件和终端:man7.org/linux/man-pages/man1/tee.1.html
Cheiron,

Answers:


42

读取文件是安全的,尽管您提到的双击可能会在某些编辑器中打开文件,该编辑器将为您提供进行更改并保存它们的选项。发生误点击,因此我建议您甚至不要让您更改文件的命令。

这些是在终端机上运行的示例。他们只会读取文件:

cat file
less file
less +F file
tail -n 5 file
tail -f file

4
许多更聪明的文件编辑器会警告您文件已更改,并询问您是否要重新加载它,但愚蠢的编辑器可能不会。
user1306322

5
@ user1306322仍然不能保证安全。突出显示文件已打开以供写入并不意味着它会被不断写入。如果在编辑器运行时未编写任何内容,则不会发出通知。而且由于编辑者可以编写一个新文件并在最上面进行重命名(因为重命名是原子的),因此写入的文件将被删除。从那时起写入的输出将进入已删除的文件。
卡巴斯德(Kasperd)'18年

13

只要您不写,就可以了。

但是,我建议使用

tail -f log_file

在另一个终端。

该命令将“跟随”文件log_file并在脚本更新后立即写入新添加的内容。


1

没有足够的代表来给Kamil Maciorowski的答案添加评论:

对于某些文件,您将需要tail -F file进行以下操作以进行轮换。例如,观看系统日志。


-1

如果脚本(或底层框架实现)在其工作期间反复打开和关闭文件句柄,则由于以下原因,它可能在随后的写模式打开中遇到共享冲突错误:
1)脚本可能会请求写操作以独占模式进行访问(不包括并发读取访问),因此,如果文件编辑器/查看器程序甚至只在读取文件,则可能会触发编写脚本错误。
2)此外,某些文件编辑器/查看器会在打开文件的整个过程中锁定文件。

总之,可能存在的问题取决于您用于查看文件的程序。而且,写入文件的脚本的实现(或底层框架)可能会引起问题。


1
根据我的经验,这在Linux中非常罕见(注意:我是家庭用户)。我知道该问题确实存在于Windows中,但该问题被标记为linux。在Linux中,哪些“编辑者/查看者”是这样工作的?强制使用哪种Linux锁?
卡米尔Maciorowski

@KamilMaciorowski不幸的是,我没有具体的警告清单。锁在任何地方都不是强制性的(Windows也不是),有些人只是使用它们。我只是说这种问题是可能的,请不要在关键任务情况下不慎使用此方法。由OP决定这是否适用或是否重要。仅仅存在上述问题就增加了这种现象已经在OP中发生的可能性。声称什么也不会发生的答案也没有提供太多新信息。
罗兰·皮拉卡斯

1
@RolandPihlakas我愿意打赌这个答案的作者已经体会到了-但仅适用于Windows。因此,它与POSIX兼容系统(例如Linux)无关,在该系统上通过tail -fless +F常规监视输出。
Chromatix

@Chromatix我对您的推理的建设性部分感到非常困惑,除了对Windows的个人憎恨外,看不到您在此处提供什么样的建议或新信息...您根本没有回答我的评论的要点。。你为什么在乎我的经历?请不要变得个人。
罗兰·皮拉卡斯

@RolandPihlakas因为您的回答给人留下了非常坚定的印象,那就是在Linux上打开只读文件是危险的,而实际上却并非如此。实际上,只要您不认为“文件末尾”是指“记录末尾”或“行尾” ,始终可以安全地读取要附加的文件。唯一会失败的情况是编写应用程序时拥有一个“强制性锁”,而很少有应用程序会这样做(标准POSIX锁是“建议性锁”),这将导致引发定义明确的错误,而不是而不是不稳定的行为。
Chromatix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.