当名为“enigma2”的进程不存在时,我正在尝试创建一个脚本,该脚本使用零填充变量。
当我运行这个脚本..。
#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"我得到输出..。
0
0 这正是我所期望的。
但当我运行这个脚本时:
#!/bin/sh
# Check if the no_enigma file exists
if [ -f /home/root/no_enigma ]; then
# If enigma2 is running then kill it
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"
re='^[0-9]+([.][0-9]+)?我得到这个输出..。2
2
It IS a number
2
2
enigma2 is running
killall: enigma2: no process killed
minisatip is already running 如果从第二个脚本的顶部删除#!/bin/sh,就会得到预期的输出。0
0
It IS a number
enigma2 is not running
minisatip is already running 为什么这三行:#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"正确地将$ENIGMA_PID变量报告为值为0,但在第二个脚本中,相同的三行将$ENIGMA_PID变量报告为值2?更新以下是对以下评论中问题的回答。这张截图显示我运行了这两个脚本。每次minisatip进程正在运行而enigma2进程没有运行时。第一个脚本的路径是/home/root/test.sh,它只有3或4行,我可以在任何地方运行它,就像这个# test.sh一样,第二个脚本的路径是/usr/bin/enigma2.sh,正如您所看到的,我运行它就像enigma2.sh一样。正如建议的那样,我更新了这两个脚本,以从管道命令中删除wc和awk,其输出将为变量: ENIGMA_PID分配一个值。我将/home/root/test.sh改为:#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"在/usr/bin/enigma2.sh中,我将这些行添加到脚本的顶部。#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"
# Check if the no_enigma file exists
...
....现在我运行了脚本,这个屏幕截图显示了输出。我正在检查的进程是一个带有路径的二进制文件: /usr/bin/enigma2 2。此二进制文件不运行。然而,当enigma2.sh脚本运行时,有两个进程ids。这是因为脚本本身称为enigma2吗?那么为什么他们的两个进程ids叫做enigma2而不是一个呢?<#>问题在此命令ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')中需要更改什么?..。当它在/usr/bin/enigma2.sh脚本中时..。所以它不算脚本,它是一个正在运行的进程的一部分?如果二进制/usr/bin/enigma2 2没有运行,则结果应为零。谢谢!Flex
if ! [[ $ENIGMA_PID =~ $re ]] ; then
echo "error: Not a number" >&2; exit 1
else
echo "It IS a number"
fi
if [ "$ENIGMA_PID" -gt 0 ]; then
echo $ENIGMA_PID
echo "$ENIGMA_PID"
echo "enigma2 is running"
killall enigma2
else
echo "enigma2 is not running"
fi
# Check if minisatip is running already, if not then start it
MINI_PID=$(ps ax|grep minisatip|grep -v grep|wc -l | awk '{print $1}')
if [ "$MINI_PID" -gt 0 ]; then
echo "minisatip is already running"
else
echo "minisatip is not running"
echo "starting minisatip"
/usr/bin/minisatip --satip-xml http://127.0.0.1:8554 -R /usr/share/minisatip/html
fi
else
# The no_enigma file does not exist
# Check if minisatip is running, if yes then kill it
MINI_PID=$(ps ax|grep minisatip|grep -v grep|wc -l | awk '{print $1}')
if [ "$MINI_PID" -gt 0 ]; then
echo "minisatip is running, killing it now"
killall minisatip
else
echo "minisatip is not running"
fi
# Check if enigma2 is running already, if not then start it
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
if [ "$ENIGMA_PID" -gt 0 ]; then
echo "enigma2 is already running"
else
echo "enigma2 is not running"
echo "starting enigma2"
/home/root/run_enigma.sh
fi
fi我得到这个输出..。
A3
如果从第二个脚本的顶部删除D4,就会得到预期的输出。
A5
为什么这三行:
A6
正确地将D7变量报告为值为0,但在第二个脚本中,相同的三行将D8变量报告为值2?
更新
以下是对以下评论中问题的回答。
这张截图显示我运行了这两个脚本。每次minisatip进程正在运行而enigma2进程没有运行时。
B9
第一个脚本的路径是/home/root/test.sh,它只有3或4行,我可以在任何地方运行它,就像这个D10一样,第二个脚本的路径是/usr/bin/enigma2.sh,正如您所看到的,我运行它就像D11一样。
正如建议的那样,我更新了这两个脚本,以从管道命令中删除wc和awk,其输出将为变量: ENIGMA_PID分配一个值。
我将/home/root/test.sh改为:
A12
在/usr/bin/enigma2.sh中,我将这些行添加到脚本的顶部。
A13
现在我运行了脚本,这个屏幕截图显示了输出。
B14
我正在检查的进程是一个带有路径的二进制文件: /usr/bin/enigma2 2。此二进制文件不运行。然而,当enigma2.sh脚本运行时,有两个进程ids。这是因为脚本本身称为enigma2吗?那么为什么他们的两个进程ids叫做enigma2而不是一个呢?
<#>问题在此命令D15中需要更改什么?
..。当它在/usr/bin/enigma2.sh脚本中时..。所以它不算脚本,它是一个正在运行的进程的一部分?如果二进制/usr/bin/enigma2 2没有运行,则结果应为零。
谢谢!
Flex
发布于 2020-05-21 05:16:12
如前所述,当从第二个脚本运行时,ps ax命令确实会产生不同的结果。
您只需要调试第二个脚本,就可以知道为什么该命令生成不同的值(并且只是为了调试目的)替换
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"使用
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"检查输出上有什么不同以及是什么导致了这个问题.然后相应地修改您的脚本。另外,正如注释所建议的,如果您的脚本name包含将被检测为假阳性的enigma2。
https://unix.stackexchange.com/questions/588000
复制相似问题