linux - 如何从 bash 脚本启动程序,然后关闭终端但让程序保持事件状态

标签 linux bash shell command-line

我想在我的桌面上有一个图标来启动Redshift使用启动时从命令行读取的自定义参数。

这是我想出的:

#!/bin/bash
default_temperature=4500
echo "Default color temperature (Night) is "$default_temperature"K."
read -p "Type in the desired value: " temperature
temperature=${temperature:-$default_temperature}
nohup redshift-gtk -l "-23.9141:-147.6650" -t "6500:"$temperature &

以上文件保存为/home/redshift.sh .我还创建了一个桌面条目来启动它,代码如下:

#!/usr/bin/env xdg-open
[Desktop Entry]
Name=Redshift (script)
Comment=Custom script to start Redshift with color temperature input
Exec="/home/redshift.sh"
Icon=redshift
Terminal=true
Type=Application

(第一行是自动添加的)。

预期的行为是:

  1. 用户双击桌面条目
  2. 控制台打开并要求(可选)输入
  3. 当用户按下 Enter 时,脚本应启动名为 redshift-gtk 的应用程序(实际上是一个位于 /usr/bin 的 Python 脚本),带有指定的参数。

现在我不关心检查输入是否有效,也不关心进程是否已经在运行。

(工作)命令的一个例子是:

redshift-gtk -l "-23.9141:-147.6650" -t "5500:2400"

目前,我什至将启动脚本简化为这个

nohup redshift-gtk -l "-23.9141:-147.6650" -t "5500:2400" &

甚至尝试过

nohup redshift-gtk -l "-23.9141:-147.6650" -t "5500:2400" && exit

但是这些都不会关闭终端窗口,它只会保持打开状态。如果我手动关闭它,Redshift 进程将被终止(这显然不是我们想要的)。

尝试了网上找到的一些可能的解决方案,似乎都行不通。在 SO 中没有找到任何相关内容。

如何正确地做到这一点?

谢谢

最佳答案

我推荐的方法是通过screen。它允许您从虚拟终端启动进程,然后从它分离,退出终端,然后稍后返回并重新连接到它(如果 session 仍然存在)。例如:

screen -d -m redshift-gtk -l "-23.9141:-147.6650" -t "5500:2400"

将以“分离模式”启动命令,然后您可以退出终端。如果您想在返回终端时检查 session ,您可以这样做:

screen -list

典型的输出看起来像这样:

There is a screen on:
    58643..System(Detached)
1 Socket in /var/folders/qg/jxb2db8d2_57nrtq5vs0xcfw0000gn/T/.screen.

查看 screen 的手册页——那里有很多有用的信息。

关于linux - 如何从 bash 脚本启动程序,然后关闭终端但让程序保持事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44350609/

相关文章:

linux - 如何抑制/重定向 grep 背景错误?

javascript - 在 squeeze 上安装 node-js 最新版本的问题

linux - 删除文件名中的零

shell - 发送带有日志文件附件的电子邮件

linux - csh 中一行开头的符号

linux - Shell 脚本挂起,但仅在调用变量或 strace 时

c++ - 什么会使 ios::fail() 评估为 1?

java - Jvm heapdump 不是由信号生成的

bash - 脚本 : substitute value in script and display it

linux - Shell 变量扩展 - 使用 env 调用实用程序时的间接寻址