当前位置:   article > 正文

linux文本文件忙,Java执行bash脚本,错误= 26文本文件忙(java executing bash script, error=26 Text file busy)...

error 26: text file busy

Java执行bash脚本,错误= 26文本文件忙(java executing bash script, error=26 Text file busy)

我有一个java代码正在写一个Linux bash脚本,然后做一个chmod来添加执行权限,然后尝试执行它。 在进程开始时,我收到IOException,说错误= 26,文本文件忙。 我已验证文件已完成写入并且流已关闭。 该chmod工作正常,但我不断收到此错误。

我注意到如果我运行调试器并逐步执行代码,它就不会出现错误,所以很明显会出现计时问题。 在我尝试执行bash脚本之前,如何确保chmod已完成? 我想避免像加入Thread.sleep(10000)这样的非可靠解决方案,以及将try / catch块中的执行放入尝试直到成功的循环内的“hacky”。

我有相当数量的代码用监听线程等来封装进程的启动,但这里是它正在做什么的简化版本(也试过这个代码,它有相同的结果):

String[] cmd1 = {"/bin/chmod", "750", postFile };

new ProcessBuilder(cmd1).redirectErrorStream(true).start().waitFor();

String[] cmd2 = { postFile };

new ProcessBuilder(cmd2).redirectErrorStream(true).start().waitFor();

每次执行后,“postFile”都有正确的750权限,但它没有执行(由于IOException)。

I've got a java code that is writing a Linux bash script out, then doing a chmod to add execute permission, then trying to execute it. I'm getting an IOException during the start of the process saying error=26, Text file busy. I've verified that the file is finished being written and the stream was closed. The chmod works fine, but I keep getting this error.

I've noticed that if I run a debugger and step through the code, it doesn't get the error, so clearly there is a timing issue involved. How can I make sure the chmod is done before I try to execute the bash script? I'd like to avoid non-reliable solutions like adding Thread.sleep(10000), and "hacky" things like putting the execution in a try/catch block inside a loop that tries until it succeeds.

I have a fair amount of code wrapping the startup of the process with listening threads, etc., but here is a simplified version of what it is doing (tried this code also and it has same result):

String[] cmd1 = {"/bin/chmod", "750", postFile };

new ProcessBuilder(cmd1).redirectErrorStream(true).start().waitFor();

String[] cmd2 = { postFile };

new ProcessBuilder(cmd2).redirectErrorStream(true).start().waitFor();

Every time after execution, the "postFile" has the correct 750 permissions, but it has not executed (due to the IOException).

原文:https://stackoverflow.com/questions/6345660

更新时间:2020-02-20 22:02

最满意答案

你确定它是负责后续错误的chmod吗? 你可以检查你确定关闭输出文件,然后再尝试运行它吗?

如果你关闭它,那么我不知道为什么chmod应该导致这个错误,但是你可以避免使用shell运行脚本来运行chmod:

String[] cmd = {"bash", postfile };

Are you sure it is the chmod that is responsible for the subsequent error? Could you check that you definitely close the output file before you try to run it?

If you do close it then I'm at a loss why chmod should cause that error, but you could avoid the need to run chmod by using your shell to run the script:

String[] cmd = {"bash", postfile };

2011-06-14

相关问答

/swap swap swap default 0 0这一行应该是写在/etc/fstab里面的吧,没有要执行的。上面的两步完成之后就行。把这一行加入/etc/fstab,里面应该已经有这一行,或者已经注释掉,你改一下,而且第一个字段可以直接写成类似/de/sdaX这样的指明swap是哪个分区。

感谢@ikra洞察检查apache日志文件,这让我发现根本原因是权限访问。 需要将www-data添加到sudoers文件中。 备份和编辑sudoers文件的说明: http : //raspbypi.com/enabling-the-sudo-command-for-a-new-user/ sudo visudo 在文件末尾添加这个www-data ALL =(ALL)NOPASSWD:ALL 按CTRL + X并按是 登录和注销以确保现在设置权限。 如果您的sudoer文件被破坏:在终端窗口中

...

此错误是指其他进程或用户正在访问您的文件。 使用lsof来检查其他进程正在使用它。 如果需要,可以使用kill命令来杀死它。 This error means some other process or user is accessing your file. Use lsof to check what other processes are using it. You can use kill command to kill it if needed.

我发现改变refile缓存和存储的目录可以解决问题。 它必须在同步文件夹之外,否则您仍会收到错误。 从谷歌搜索看来这是一个Windows问题作为主机。 如果有人遇到此问题并需要快速修复,请将其添加到application.rb文件中 Refile.store ||= Refile::Backend::FileSystem.new("/tmp/uploads/store".to_s)

Refile.cache ||= Refile::Backend::FileSystem.new("/tmp/upl

...

当你有Rscript时,为什么这是一个bash脚本? 那么为什么不将它重写为Rscript.exe执行的R脚本,允许您测试组件 intialization 数据库连接 核心工作 ... 独立? 编辑(响应你的评论): R可以通过library()或直接通过source()调用R,包。 你有一个comples的调试问题,你应该尝试删除一些完整性。 此外,R脚本可以使用getopt或optparse包来处理命令行参数。 编辑2:你知道R有一个RMySQL包允许你从R调用db吗? I put a cop

...

我已经解决了这个问题,问题是我正在使用虚拟框并在同步文件夹中部署项目。 所以我尝试将文件夹移动到本地文件系统,并且错误消失了。 愿它帮助别人。 I have solved this problem, and the matter is I am using virtual box and deploying the project in sync folders. So I try to move the folder to local file system, and the error is

...

如果你想确保shuf使用高熵源: shuf -n 1 --random-source=/dev/random

也就是说,听起来你真的想要的是没有看到同样的借口两次(直到他们都被消耗掉了)。 既然如此,我会考虑洗一次文件,存储一个计数器,并依次显示每一行。 # In Bash 3 or earlier, you'll need to hardcode a FD number here.

exec {lock_fd}>excuses.count

flock -x "$loc

...

感谢Marc B.找到了解决方案。问题是PHP bin的路径。 即使存在/ usr / bin / php路径并且在环境中设置了php变量,我也需要将它们都更改为/ usr / local / bin / php。 这是我在PHP_BINDIR常量中找到的正确路径。 Found the solution thanks to Marc B. The issue was the path to the PHP bin. Even though /usr/bin/php path exists and

...

你确定它是负责后续错误的chmod吗? 你可以检查你确定关闭输出文件,然后再尝试运行它吗? 如果你关闭它,那么我不知道为什么chmod应该导致这个错误,但是你可以避免使用shell运行脚本来运行chmod: String[] cmd = {"bash", postfile }; Are you sure it is the chmod that is responsible for the subsequent error? Could you check that you definitely

...

理所当然的,“左”这个词只会在文件中出现一次,你可以使用这个脚本来执行你想要的编辑: #!/bin/bash

#

insideleft='false'

while read line

do

# using grep -c to make sure it matches even if there are spaces

if [ $(echo $line | grep -c left) -eq 1 ]

then

insideleft='true'

...

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/188868
推荐阅读
相关标签
  

闽ICP备14008679号