TL;DR 在底部。
我正在尝试为运行 Arch / BSPWM 的笔记本电脑制作一个简单的锁屏。我发现了一个名为 cmatrix 的程序,它有一个屏幕保护程序标志,当按下某个键时,它会退出。我试图将 bspc 命令与 cmatrix 和 vlock 链接在一起,制作一行可以运行的命令来全屏启动 cmatrix,按下键时运行 vlock,然后在 vlock 退出后退出。
我唯一的问题是,为了使锁定屏幕有效,我需要退出 sxhkd 以防止人们简单地关闭包含 cmatrix/vlock 的窗口。我已将 pkill sxhkd 添加到命令链中,这样就可以了。有问题的部分是重新启动 sxhkd。简单地将 sxhkd 添加到末尾不起作用,因为终端窗口在 sxhkd 完成之前不会关闭,而这永远不会完成。此外,如果终端窗口关闭,sxhkd 会停止,因为它正在其中运行。
我尝试使用“sxhkd &”,但由于某种原因,这导致整个程序无法运行。
以下是我目前所拥有的几乎可以正常工作的命令:
urxvtc -e bash -c "sleep 0.1; pkill sxhkd; sleep 0.1; bspc window -t fullscreen=on; sleep 0.1; cmatrix -u 9 -s; sleep 0.1; vlock; sleep 0.1; sxhkd"
睡眠命令是为了防止程序以错误的顺序启动(有时在 cmatrix 运行之前会出现 vlock 密码提示)
它目前所做的是启动一个新的 urxvt 窗口(如果我想为 cmatrix 使用终端字体,这一点很重要),并且它会终止 sxhkd 以防止任何人关闭窗口。它使用 bspc 全屏显示并运行 cmatrix。按下某个键时,cmatrix 退出并出现 vlock 密码提示。正确输入密码后,它会尝试重新启动 sxhkd,但它们仍然保持耦合。
任何帮助将不胜感激!
总结
如何使用命令(通常从脚本运行)打开运行其他命令的终端窗口,然后启动应用程序(如 GUI 应用程序),然后终端窗口关闭但 GUI 应用程序继续运行?
更简单的命令示例:
urxvtc -e bash -c "echo hello!; sleep 3; pavucontrol"
这应该会打印 hello!,等待 3 秒,然后启动 pavucontrol 并关闭终端,留下 pavucontrol。相反,终端保持打开状态,因为 pavucontrol 正在运行。
urxvtc -e bash -c "echo hello!; sleep 3; pavucontrol &"
这应该会打印 hello!,等待 3 秒,然后启动 pavucontrol 并关闭终端,留下 pavucontrol。然而,当终端在 3 秒后关闭时,pavucontrol 却不见了。
答案1
我在单独使用 nohup 时似乎偶然发现了解决方案。似乎 nohup 不会完全从终端释放作业,因此运行nohup program & exit
不起作用 - 终端抱怨有正在运行的作业。简单的解决方案是在它们之间添加另一个 sleep,如下所示:
nohup command & sleep 2 && exit
睡眠时间可能可以缩短一点,但如果太短,可能会导致 nohupped 程序关闭。
编辑:不过,我在使用 nohup 和 exit 时遇到了一些不一致的行为 - 有时它会退出并让程序继续运行,有时它会抱怨有作业。我不确定为什么会发生这种情况。
答案2
要启动和孤立后台进程,请使用nohup my_command &
。之后,您可以exit
启动 shell 而无需终止新进程。更多有关流程管理的内容。