使用 bash 脚本切换程序

使用 bash 脚本切换程序

我正在尝试制作一个可以切换的脚本redshift(夜间模式应用程序)。所以,我做了这个,

#!/bin/bash

pgrep redshift > /dev/null && \ 
         killall redshift || \
         setsid redshift [options] &> /dev/null

这会查找该程序,如果该程序在后台运行,则该程序将被终止,否则它将启动并运行setsid。现在,如果我要终止该进程,这个脚本就可以工作,但是当我重新运行它时,这个脚本会挂起。

  • 我究竟做错了什么?
  • 是否有其他方法可以将进程置于后台,以便杀死终端不会停止程序?

答案1

当您使用 bash 调用程序时,bash 会解释&>为特殊的重定向运算符(同时重定向 stdout 和 stderr),而不是您想要的那样:后台运算符&和 stdout 重定向>。将两个标记分开,您将得到您期望的后台行为:

#!/bin/bash

pgrep redshift > /dev/null && 
  killall redshift || 
    setsid redshift [options] & > /dev/null

考虑对未来的自己更友善一些,并稍微扩展一下逻辑;如果你想杀死redshift它,那么用一些选项启动它:

if pgrep redshift > /dev/null
then
  pkill redshift
fi
setsid redshift options & > /dev/null 

答案2

redshift 具有切换功能

发送信号 SIGUSR1 到 redshift 进程进行切换:

pkill -USR1 redshift

有记录在他们的网站上,但不在软件的文档。我开了一个拉取请求在其手册页中记录此功能。

答案3

我用它来切换 Gnome 中的桌面图标。

pkill nemo-desktop || nemo-desktop

当然这也适用于红移。

pkill redshift || redshift

相关内容