我正在尝试创建一个脚本,如果它正在运行,那么退出compton;如果它没有运行,则启动它。我从man那里读到,如果找到了进程,它应该退出1,所以我试着制作一个使用它的脚本.然而,这只是不工作,它开始,如果它是关闭,但不关闭它。我做错什么了??
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ $status == 1 ]];
then
killall compton
else
exec compton -b
fi
echo $status发布于 2019-03-19 22:00:56
您将在您的pgrep变量中获得status输出。这并不是你所期望的结果。
pgrep输出进程的进程it (PID),与您提供的模式相匹配。如果有一个进程的名称与compton匹配,那么$status将是该进程或这些进程的PID。pgrep还返回退出状态,但是命令替换不会将退出状态捕获为字符串。
在您的测试中,您将$status与1进行比较。compton不太可能有PID 1。
如果要杀死任何存在的compton进程,如果不存在compton进程,则启动compton -b,则可以使用
#!/bin/sh
if ! pkill compton; then
exec compton -b
fi这使用了pkill的退出状态。pkill工具的工作方式与pgrep相当(它们通常是作为一对分布和安装的),但是pkill没有输出匹配进程的PID(比如pgrep ),而是向匹配进程发送TERM信号(默认情况下)。
if关键字使用与它一起使用的命令的退出状态。
!反转测试的意义,以便
pkill compton成功,这意味着有一个或几个compton进程现在已经被终止,或者至少发出了信号,并且exec compton -b将不会被执行。pkill compton失败(没有与名称匹配的进程,或者pkill中有一些内部错误),则if语句的主体将调用您的exec compton -b,它将用运行compton -b所产生的进程替换D31进程。发布于 2019-03-19 21:23:09
您应该控制将在$中的pgrep进程的退出状态?变量。或者检查存储pgrep输出的$status变量是否为f.e。非零长度字符串。问题中的脚本检查变量状态下的字符串是否为"1“。
所以
#!/bin/bash
pgrep compton >/dev/null
if [[ $? -eq 0 ]]
then
killall compton
else
exec compton -b
fi或
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ -n "$status" ]]
then
killall compton
else
exec compton -b
fihttps://unix.stackexchange.com/questions/507290
复制相似问题