我有一个在终端上运行的脚本,它会打印一些输出。例如,我想在 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=True
为Terminal=False
不在终端中打开。在名为“anyfile.dekstop”的文件中键入以下内容并使其可执行(右键单击 - 属性 - 允许将文件作为程序执行)
[桌面入口]
版本=1.0
Exec="可执行文件或 .sh 文件的路径"
名称=样品
通用名称=示例
评论=任何评论
编码=UTF-8
终端=假
类型=应用
类别=应用
图标=任何图标链接