我们现在有一个脚本,它可以检查后台是否有运行。它通过运行以下命令(更新为包含我在服务器上运行的完整测试脚本示例)来完成此操作:

#!/bin/csh -f
sleep 30 &
set testFile = /tmp/checkFile$$
jobs -l > $testFile

它将正在运行的进程打印到屏幕上,但检查文件中没有显示任何内容,从而导致服务器认为其他部分无法启动)。完全不明白为什么这不管用。其他命令似乎工作正常。
我正在运行RHEL6.8,并以非根用户的身份运行该命令。。运行其他命令(如ps > /tmp/testFile)没有问题。
在对系统进行进一步研究后,添加了以下注释:
/bin/csh是到/bin/tcsh的软链接(我删除了csh标签)
将shebang行更改为/bin/tcsh-f并没有改变任何内容(显然,只是想声明)
文件已创建,但内容为空

最佳答案

在某些版本的tcsh中,jobs -l命令将其输出输出输出到stderr。另一些则打印到标准输出。(我认为打印到stdout是正确的行为。)
解决办法是改变

jobs -l > $testFile # redirect stdout


jobs -l >& $testFile # redirect both stdout and stderr

对于任何版本的tcsh,不管有没有这个bug,这都应该是正确的。
请注意,op系统上的tcsh是指向csh的符号链接,因此这可能是一个tcsh问题。
https://github.com/tcsh-org/tcsh有一个tcsh源的镜像。日志显示了2016年5月24日所做的更改,“不要将作业打印到stderr(paulo.cesar.pereira.de.andrade)”。查看提交历史,似乎jobs输出在tcsh版本6.19.01和6.20中打印到stdout,在版本6.19.00和更早版本中打印到stderr。显然,OP的新RHEL6.8系统上的一些包已经更新。
我在TCSH6.14.00和6.18.01中看到jobs -l正在给标准输出写信。这可能是一种倒退。(我无法从源代码构建TCSH6.19或更早版本。)

关于linux - jobs -l命令无法使用csh写入文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46414671/

10-13 07:30