立即退出父进程,让子进程仍在运行

立即退出父进程,让子进程仍在运行

我正在尝试从我的 WM 创建一个非常简单的穷人“运行盒”/程序启动器。

从我的菜单中我有;

"Run" f.exec "xterm -fg black -bg white -geometry 25x1 -T Run -e 'read input && exec $input' &"

虽然这创建了一个漂亮的小运行对话框,它接受用户输入,但它在子程序运行时保持运行 - 当它应该立即退出时,子进程启动。

最初这似乎是一个简单的想法,但现在看起来比我的脚本 fu 提供的要困难得多。有小费吗?

编辑:我想我会回来并发布我最后所做的事情,以防万一有人试图做类似的事情。

来自 .twmrc 中 TWM 的菜单部分

"Command" !"xterm -fg dimgrey -bg white -geometry 25x1+840+1150 -name run -title Run -e ~/scripts/getrun &"

以及getrun的内容

read -p "# " userinput
nohup $userinput >/dev/null 2>&1 &
PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID

答案1

我认为&根据问题的描述,命令行的末尾不是您想要的。在本例中,您将 xterm 置于后台并保持脚本运行,但在 xterm 之后没有任何内容可运行。您可能想将&结束引号放在执行逗号内。然而,我不能保证它会起作用,因为我不确定 xterm 的行为和参数以及 TWM 的工作原理。如果它不起作用,我将展示一个如何在标准 shell 中执行此操作的示例,该示例可能可以通过单独的脚本重现到您使用它的上下文中。

作为如何测试和实现它的示例,我在/tmp/目录中创建了两个脚本。第一个runbg.sh包含预期的功能:

#!/bin/sh

read cmdline
$cmdline &

第二个脚本,/tmp/infiniteloop.sh是一种测试它是否按预期工作的方法,它是一个无限循环,带有一个休眠计时器,每次迭代都会将当前日期附加到文件中/tmp/infiniteloop.tmp

#!/bin/sh

while true; do
  date >> /tmp/infiniteloop.tmp
  sleep 30
done

如果您随后运行/tmp/runbg.sh并键入命令/tmp/infiniteloop.sh,它会让您返回 shell。您可以infiniteloop.sh通过 a 检查脚本是否仍在运行tail -f /tmp/infiniteloop.tmp,如果您所做的一切正确,它将每 30 秒向您显示一个包含当前日期的新行。

因此,对于您的情况,我的建议是编写一个单独的 shell 脚本来读取命令并在后台运行它,然后在 TWM 菜单配置文件中调用该脚本。

相关内容