我正在尝试制作一个可以切换的脚本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
答案3
我用它来切换 Gnome 中的桌面图标。
pkill nemo-desktop || nemo-desktop
当然这也适用于红移。
pkill redshift || redshift