“是什么产生的?”;“文本文件忙”;Unix中的消息?

“是什么产生的?”;“文本文件忙”;Unix中的消息?,unix,Unix,什么操作会产生“文本文件忙”错误?我说不准 我认为这与我正在创建一个临时python脚本(使用tempfile)并从中使用execl有关,但我认为execl会更改正在运行的文件。此错误意味着其他进程或用户正在访问您的文件。使用lsof检查其他进程正在使用它。如果需要,您可以使用kill命令将其杀死。我已经有一段时间没有看到这个消息了,但它在SystemVR3中很流行,大约几十年前。当时,这意味着您不能在程序运行时更改其可执行文件 例如,我正在构建一个名为rmk的make类似工作,过了一段时间它就

什么操作会产生“文本文件忙”错误?我说不准


我认为这与我正在创建一个临时python脚本(使用tempfile)并从中使用execl有关,但我认为execl会更改正在运行的文件。

此错误意味着其他进程或用户正在访问您的文件。使用
lsof
检查其他进程正在使用它。如果需要,您可以使用
kill
命令将其杀死。

我已经有一段时间没有看到这个消息了,但它在SystemVR3中很流行,大约几十年前。当时,这意味着您不能在程序运行时更改其可执行文件

例如,我正在构建一个名为
rmk
make
类似工作,过了一段时间它就可以自我维护了。我会运行开发版本并让它构建一个新版本。要使其正常工作,必须使用变通方法:

gcc -g -Wall -o rmk1 main.o -L. -lrmk -L/Users/jleffler/lib/64 -ljl
if [ -f rmk ] ; then mv rmk rmk2 ; else true; fi ; mv rmk1 rmk
因此,为了避免“文本文件忙”的问题,构建创建了一个新文件
rmk1
,然后将旧的
rmk
移动到
rmk2
(重命名不是问题;取消链接是),然后将新构建的
rmk1
移动到
rmk


我已经有很长一段时间没有在现代系统上看到错误了……但我并不经常让程序自行重建。

不知道原因,但我可以快速轻松地解决问题

我刚刚在CentOS 6上经历了这种奇怪的情况,在
cat>shScript.sh
(粘贴,
^Z
)之后,我用KWrite编辑了文件。奇怪的是,没有明显的脚本执行实例(
ps-ef


我的快速解决方法是简单地执行
cp shScript.sh shScript2.sh
,然后我就可以执行
shScript2.sh
。然后我把它们都删除了。完成了

我在PHP中遇到这个问题时,对文件使用了
fopen()
,然后在对其使用
fclose()
之前尝试
unlink()

不好:

$handle=fopen('file.txt');
//做点什么
取消链接('file.txt');
好:

$handle=fopen('file.txt');
//做点什么
fclose($handle);
取消链接('file.txt');

您可能会发现这在CIFS/SMB网络共享上更常见。Windows不允许在其他文件打开时写入该文件,即使该服务不是Windows(可能是其他NAS产品),它也可能会复制相同的行为。它还可能是某些潜在NAS问题的一种表现,这些问题与锁定/复制有着模糊的关系。

我的一个经验:

我总是通过逆向工程更改Chrome的默认键盘快捷键。修改后,我忘记关闭Chrome并运行了以下操作:

sudo cp chrome /opt/google/chrome/chrome
cp: cannot create regular file '/opt/google/chrome/chrome': Text file busy
使用strace,您可以找到更多详细信息:

sudo strace cp ./chrome /opt/google/chrome/chrome 2>&1 |grep 'Text file busy'
open("/opt/google/chrome/chrome", O_WRONLY|O_TRUNC) = -1 ETXTBSY (Text file busy)
当您尝试写入内核当前正在执行的文件,或执行当前打开以供写入的文件时,就会发生这种情况


来源:

如果试图在Linux机器上构建
phpredis
,您可能需要在运行文件之前,通过
sleep
命令给它时间来完成对文件权限的修改:

chmod a+x /usr/bin/php/scripts/phpize \
  && sleep 1 \
  && /usr/bin/php/scripts/phpize

在我的例子中,我试图执行一个shell文件(扩展名为.sh) 在csh环境中,我收到了错误消息

和bash一起跑步对我来说很有效。 比如说

bash file.sh


最小可运行C POSIX复制示例

我建议您了解底层API,以便更好地了解正在发生的事情

睡眠

#define _XOPEN_SOURCE 700
#include <unistd.h>

int main(void) {
    sleep(10000);
}
busy.out
传递断言,并
perror
输出:

Text file busy
因此,我们推断该消息是在glibc中硬编码的

或者:

echo asdf > sleep.out
使Bash输出:

-bash: sleep.out: Text file busy
对于更复杂的应用程序,您也可以使用
strace

strace ./busy.out
其中包括:

openat(AT_FDCWD, "sleep.out", O_WRONLY) = -1 ETXTBSY (Text file busy)
在Ubuntu 18.04、Linux内核4.15.0上测试

如果先
取消链接
则不会发生错误

不忙

#define _XOPEN_SOURCE 700
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(void) {
    assert(unlink("sleep.out") == 0);
    assert(open("sleep.out", O_WRONLY|O_CREAT) != -1);
}
这不会生成错误,即使第二个
gcc
调用正在写入
sleep.out

快速的
strace
显示GCC在写入之前首先取消链接:

 strace -f gcc -std=c99 -o sleep.out ./sleep.c |& grep sleep.out
包含:

openat(AT_FDCWD, "sleep.out", O_WRONLY) = -1 ETXTBSY (Text file busy)
[pid  3992] unlink("sleep.out")         = 0
[pid  3992] openat(AT_FDCWD, "sleep.out", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
它不会失败的原因是,当您
取消链接
并重新写入文件时,它会创建一个新的inode,并为正在运行的可执行文件保留一个临时挂起的inode

但是如果您只是
写入
而没有
取消链接
,那么它会尝试写入与正在运行的可执行文件相同的受保护inode

POSIX 7
open()

[ETXTBSY]

该文件是正在执行的纯过程(共享文本)文件,oflag是O_WRONLY或O_RDWR

男子2公开赛

等等

路径名是指当前正在执行并请求写入访问的可执行映像

glibc来源

2.30上的快速grep提供:

sysdeps/gnu/errlist.c:299:    [ERR_REMAP (ETXTBSY)] = N_("Text file busy"),
sysdeps/mach/hurd/bits/errno.h:62:  ETXTBSY                        = 0x4000001a,        /* Text file busy */
手动输入
手动/errno.texi

@deftypevr Macro int ETXTBSY
@standards{BSD, errno.h}
@errno{ETXTBSY, 26, Text file busy}
An attempt to execute a file that is currently open for writing, or
write to a file that is currently being executed.  Often using a
debugger to run a program is considered having it open for writing and
will cause this error.  (The name stands for ``text file busy''.)  This
is not an error on @gnuhurdsystems{}; the text is copied as necessary.
@end deftypevr

如果您使用MobaXTerm之类的工具通过ssh连接运行.sh,并且如果该工具具有用于从本地计算机编辑远程文件的autosave实用程序,则会锁定该文件


关闭并重新打开SSH会话可以解决此问题

这是一个超级快速的复制程序:
echo-e'#include\nint main(void){sleep(5);return 0;}>slowprog.c&&cc slowprog.c&&cp a.out b.out&(./a.out&);睡眠1&cp b.out a.out
。在我的新Fedora上生成了错误消息“cp:无法创建常规文件'a.out':文本文件忙”。@ArjunShankar这是一个在现代Linux上用“direct”复制的C系统调用:GCC现在只能覆盖正在运行的可执行文件,因为默认情况下,如果首先执行
取消链接
。特定的
文本文件忙
错误是关于在
root@h1:bin[0]# mount h2:/ /x             
root@h1:bin[0]# cp /usr/bin/cat /x/usr/local/bin/
root@h1:bin[0]# umount /x
...
root@h2:~[0]# /usr/local/bin/cat 
-bash: /usr/local/bin/cat: Text file busy
root@h2:~[126]#

ubuntu 20.04, 5.4.0-40-generic
nfsd problem, after reboot ok
@deftypevr Macro int ETXTBSY
@standards{BSD, errno.h}
@errno{ETXTBSY, 26, Text file busy}
An attempt to execute a file that is currently open for writing, or
write to a file that is currently being executed.  Often using a
debugger to run a program is considered having it open for writing and
will cause this error.  (The name stands for ``text file busy''.)  This
is not an error on @gnuhurdsystems{}; the text is copied as necessary.
@end deftypevr
root@h1:bin[0]# mount h2:/ /x             
root@h1:bin[0]# cp /usr/bin/cat /x/usr/local/bin/
root@h1:bin[0]# umount /x
...
root@h2:~[0]# /usr/local/bin/cat 
-bash: /usr/local/bin/cat: Text file busy
root@h2:~[126]#

ubuntu 20.04, 5.4.0-40-generic
nfsd problem, after reboot ok