因执行nohup而产生的Bad file descriptor 和 Warning: "Error reading character from command line" 错误解决

本文解决nohup后台运行matlab时出现Badfiledescriptor及Errorreadingcharacterfromcommandline错误,通过调整命令格式,将输入重定向从main.m文件获取,解决了文件读写问题。

nohup运行matlab 命令产生了Bad file descriptor 和 Warning: “Error reading character from command line” 的错误
错误原因是nohup下执行matlab的文件的命令格式错误;
原输入为:

nohup matlab -nodesktop -nosplash -nodisplay -r  main >log.txt 2>&1   &

以上命令的意思是,服务器后台运行main.m文件,对于一般情况下,执行没有问题,当main.m文件中涉及一些文件的读取及保存操作时会输出Bad file descriptor 和 Warning: “Error reading character from command line” 的错误。

把命令改为:

nohup matlab -nodesktop -nosplash -nodisplay < main.m >log.txt 2>&1   &

问题得到解决。
解释一下:“>log.txt” 指把输出的内容重定向到log.txt中,2>&1 的意思是把错误信息也输入到log.txt中,2指的是标准输入输出错误(stderr),1指的是标准输出(stdout),2>&1意思是2等同于1输出,最后的&是后台运行的意思,与nohup命令合在一起使用。

### 问题分析 当在 Linux 中通过 `crontab` 使用 `nohup` 运行 Java 命令时,如果出现错误提示 `nohup: failed to run command 'java': No such file or directory`[^1],通常是因为环境变量未被正确加载到 `cron` 的环境中。尽管手动执行 `java -version` 或其他相关命令能够成功运行,但在 `crontab` 下可能无法识别这些路径。 以下是详细的解决方案: --- ### 解决方案 #### 方法一:显式指定绝对路径 由于 `crontab` 不会自动继承用户的 shell 环境变量,因此可以尝试直接使用 Java 可执行文件的完整路径来调用程序。可以通过以下步骤找到并设置 Java 路径: 1. 查找 Java 安装目录: ```bash which java ``` 输出类似于 `/usr/bin/java` 或者自定义安装路径下的可执行文件位置。 2. 修改脚本中的 Java 调用部分,替换为完整的路径。例如: ```bash /path/to/java -jar your-application.jar >> nohup.out 2>&1 & ``` 这种方法绕过了依赖于环境变量的问题,确保即使缺少 `$PATH` 配置也能正常工作。 --- #### 方法二:修改 `.bashrc` 并应用至 Crontab 虽然已经设置了本地用户环境变量(如 `.bashrc`),但需要注意的是,默认情况下 `crontab` 不会读取该配置文件。为了使 Cron 工作时能访问正确的环境变量,需采取额外措施。 1. 编辑个人或系统的初始化脚本,在其中加入必要的环境声明: ```bash export JAVA_HOME=/home/soft/jdk1.8.0_261 export PATH=$PATH:/home/soft/jdk1.8.0_261/bin ``` 2. 让 cron 加载此配置前缀每条任务记录之前加上如下指令以激活所需上下文: ```bash * * * * * . $HOME/.bashrc && /path/to/command arg1 arg2 ... ``` 或者创建一个新的启动脚本来完成整个过程封装起来再由定时器触发它即可实现自动化管理目的同时保持一致性减少重复劳动量提高效率降低维护成本。 --- #### 方法三:直接在脚本内部设定环境变量 另一种更灵活的方式是在实际要被执行的任务脚本里重新定义所需的全部必要参数而不是依靠外部传递过来的内容因为后者可能存在不确定性因素影响最终效果达成率从而导致失败情况发生所以建议这样做: 编辑目标 Shell Script 文件头部增加几行用于初始化操作比如这样: ```bash #!/bin/bash export JAVA_HOME="/opt/jdk" export PATH="$JAVA_HOME/bin:$PATH" # Your original script logic follows here... ``` 如此这般之后无论何时何地只要按照预定计划时间点到达就会顺利开启进程而不会再次遭遇找不到对应组件之类的尴尬局面啦! --- ### 总结说明 以上三种途径各有优劣之处具体选用哪一种取决于实际情况以及偏好程度如何权衡利弊做出最佳决策才是最重要的哦~记得测试验证完毕后再正式投入使用哟~ ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值