如何从bash脚本启动程序,然后关闭终端,但保持程序活着

时间:2017-06-04 03:49:28

标签: 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脚本)。
  4. 现在我不关心检查输入是否有效,也不关心进程是否已经运行。

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

    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中没有找到任何相关内容。

    如何正确地做到这一点?

    由于

2 个答案:

答案 0 :(得分:1)

我建议这样做的方式是screen。它允许您从虚拟终端启动进程,然后从虚拟终端分离,退出终端,然后稍后返回并重新连接到它(如果会话仍然存在)。例如:

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

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

screen -list

典型输出如下所示:

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

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

答案 1 :(得分:0)

(鉴于OP的原始问题,这个建议没有实际意义。)

bash中,您可以尝试:

redshift-gtk -l "-23.9141:-147.6650" -t "5500:2400" &
disown $!

请注意,无论如何,&是产生子流程所需的,&&将等待它完成。

编辑:

我一定是非常粗心地阅读你的描述(或者错过了更新,如果有的话),所以我没有考虑在继续后台之前做输入的要求。你可以使用一个名为expect的实用程序为这种效果做一些魔术,但这并不是一件容易的事。我希望能够给你更多的指示,但我自己只是触及了使用它的表面。