将终端程序中运行的内容发送到后台

将终端程序中运行的内容发送到后台

我有一个在终端上运行的脚本,它会打印一些输出。例如,我想在 5 秒后将其发送到后台,而无需按键(且无需修改脚本)。像 bash 脚本这样启动我的脚本,休眠一段时间并将正在运行的应用程序发送到后台。一旦它进入后台,我就不关心输出了。

UPD:什么不起作用:

  • nohup
  • after 脚本的用法&- 它立即将其发送到后台,同时输出仍然发送到终端(这是我想避免的)

答案1

没有非 hacky 的方法可以将另一个进程的输出重定向到其他地方 [1],但是如果A)您不打算将进程带回前台并且b)可以接受另一个进程(轻量级cat)也在程序运行的整个过程中运行,这可能会这样做:

{ your_program ... & } | (trap : INT; cat & sleep 5; kill $!; cat >/dev/null &)

您可能希望将程序的 stderr 和 stdout 重定向到带有your_program 2>&1.

[1] 可能的 hacky 方法是附加调试器并从其内部重定向其输出。

答案2

现在我看到了一个很大的误解:我认为工作应该在前台开始,并在 5 秒后神奇地切换到后台,并且输出并不重要。不过,有了这个答案,输出仍在继续...... Q 似乎等于“背景”和“无输出”。无论如何,这很有趣:

使用这个辅助脚本“吊带”...

#!/bin/bash
sleep 1
pid=$(pidof -x counter.sh)
sleep 3
kill -s STOP $pid
sleep 1
kill -s CONT $pid

...我可以暂停一个名为“counter.sh”的脚本并使其在后台重新启动。通话内容是:

./suspender & ./counter.sh

“Suspender”在后台启动并等待一秒钟,直到计数器运行。它获取 pid 并等待 3 秒(按要求延迟)。 STOP 信号对应于ctrl-Z,CONT 信号对应于bg。中间的睡眠是必要的。

Counter 是一个你想观看几秒钟并经常按住 ctrl-c 的程序。五秒钟后,它应该释放提示。输出并不重要。这只是打印 10 个数字,速度越来越慢。

#!/bin/bash 
for i in {1..10}
do 
  sleep $i; echo $i
done

随着作业控制消息和输出的继续,这感觉不太好。

在 suspend-resume-in-bg 操作之前,您可以使用 ctrl-c 停止脚本,之后您可以使用提示符。几乎说得通了...

答案3

您可以创建一个 .desktop 配置文件,并将其与 bash 文件链接。这样,您就可以执行 shell 文件,并且它不会在终端中打开。请务必将 更改Terminal=TrueTerminal=False不在终端中打开。在名为“anyfile.dekstop”的文件中键入以下内容并使其可执行(右键单击 - 属性 - 允许将文件作为程序执行)

[桌面入口]

版本=1.0

Exec="可执行文件或 .sh 文件的路径"

名称=样品

通用名称=示例

评论=任何评论

编码=UTF-8

终端=假

类型=应用

类别=应用

图标=任何图标链接

相关内容