我们目前有一个脚本,用于检查是否有东西在后台运行。它通过运行以下命令(已更新以包含我在我们的服务器上运行的完整测试脚本示例)来执行此操作:
#!/bin/csh -f
sleep 30 &
set testFile = /tmp/checkFile$$
jobs -l > $testFile
它在屏幕上打印正在运行的进程,但检查文件中没有任何内容,因此导致服务器认为其他部分未能启动)。完全不知道为什么这不起作用。其他命令似乎工作正常。
我正在运行 rhel 6.8 并以非根用户身份运行命令。 .运行其他命令(例如 ps >/tmp/testFile
)没有问题。
在进一步挖掘系统后,添加了以下注释:
- /bin/csh 是/bin/tcsh 的软链接(soft link)(我删除了 csh 标签)
- 将 shebang 行更改为/bin/tcsh -f 并没有改变任何东西(显然但想声明)
- 文件已创建但内容为空
最佳答案
在某些版本的 tcsh 中,jobs -l
命令将其输出打印到 stderr。在其他情况下,它打印到标准输出。 (我会说打印到标准输出是正确的行为。)
解决方法是改变
jobs -l > $testFile # redirect stdout
到
jobs -l >& $testFile # redirect both stdout and stderr
这对任何版本的 tcsh 都应该能正常工作,无论有没有这个错误。
请注意,OP 系统上的 tcsh 是指向 csh 的符号链接(symbolic link),因此这可能是一个 tcsh 问题。
在 https://github.com/tcsh-org/tcsh 有一个 tcsh 源的镜像.日志显示 2016-05-24 所做的更改,“不要将作业打印到 stderr (paulo.cesar.pereira.de.andrade)”。查看提交历史,jobs
输出似乎在 tcsh 6.19.01 和 6.20 版本中打印到 stdout,在 6.19.00 及更早版本中打印到 stderr。显然,OP 较新的 RHEL 6.8 系统上的一些软件包已经更新。
我看到 jobs -l
在 tcsh 6.14.00 和 6.18.01 中写入标准输出。这可能是一种倒退。 (我无法从源代码构建 tcsh 6.19 或更早版本。)
关于linux - jobs -l 命令无法使用 csh 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46414671/