“是什么产生的?”;“文本文件忙”;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 7open()
[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