bash - 下一个命令后显示后台进程标准输出
问题描述
我正在一个子shell中运行一个进程,该进程可能会或可能不会挂起,然后如果该进程在10秒后仍在运行,则终止该进程。
这样做时,我使用管道stdout
和stderr
/dev/null 连接> /dev/null 2>&1
,这似乎有效。stdout
但是,无论我使用什么命令,kill 命令的输出都会打印到我的下一个命令之后。
[me@test] (Command_That_May_Hang.sh)&
[me@test] X=$!
[me@test] (sleep 10 && kill -9 $! > /dev/null 2>&1)&
[me@test] ps
> PID TTY TIME CMD
> 22741 pts/1 00:00:00 bash
> 27585 pts/1 00:00:00 ps
> [1]+ Killed Command_That_May_Hang.sh > /dev/null 2>&1
我曾尝试移到/dev/null 2>&1
之外()
甚至之后&
,但结果没有任何变化。作为参考,这些迭代看起来像:
(sleep 10 && kill -9 $!) > /dev/null 2>&1 &
(sleep 10 && kill -9 $!)& > /dev/null 2>&1
执行该进程然后将其杀死都成功,似乎我只能暂时抑制输出,这是一种奇怪的行为。任何有关正确发送输出的帮助/dev/null
将不胜感激。
解决方案
该消息由 bash 本身打印,而不是由kill
命令打印。因此,您不能通过重定向脚本中的任何输出来抑制它。
您可以做的是通过执行禁用作业控制的监视模式
set +m
引用 bash 手册页:
-m监控模式。作业控制已启用。对于支持它的系统上的交互式 shell,默认情况下此选项处于启用状态(请参阅上面的 JOB CONTROL)。所有进程都在一个单独的进程组中运行。当后台作业完成时,shell 会打印一行包含其退出状态的行。
使用+m
监视模式被禁用。
推荐阅读
- dependency-injection - 使用 Ninject 将父级注入子类
- javascript - 如何触发 TouchableOpacity 的 onPress() 而不是 AutoComplete 输入的 onBlur()?
- ajax - 在站点范围内添加一个或多个表单并使用 Ajax 提交
- android - 在 android 应用程序的所有屏幕顶部查看
- mysql - mysql查询用不同的字段对重复记录进行分组
- ios - 从 iOS React Native FS 上的 url 下载图像
- android - 从 Firebase 存储设置 imageView
- ssl - 在 .NetCore 控制台应用程序中生成受信任的自签名证书
- python - 比较上次创建文件和下一个文件的记录:Python Scraping BS4
- .net - 任务计划程序不会运行我的 .net 控制台应用程序