您好,我正在尝试制作一个在运行前检查 3 个文件的脚本。如果他们正在运行或没有运行。我的代码有什么问题吗?
#!/bin/bash
if [[ ! $(pgrep -f a1.php) ]]; //check if any pid number returned if yes close and exit this shell script
exit 1
if [[ ! $(pgrep -f a2.php) ]]; //check if any pid number returned if yes close and exit this shell script
exit 1
if [[ ! $(pgrep -f a3.txt) ]]; //check if any pid number returned if yes close and exit this shell script
exit 1
else
php -f a.php; php -f b.php; sh -e a3.txt //3 files is not running now we run these process one by one
fi
答案1
您没有
if
在 bash 中使用正确的格式,特别是您错过了then
和fi
。$()
subshell 可能没有按照你的想法做。它返回内部命令的标准输出,而不是退出代码(这通常是您测试的对象)。要么$(pgrep -c -f a1.php) -gt 0
使用-c
标志返回匹配进程的数量,要么pgrep -f a1.php > /dev/null
使用退出代码会更好。[[ ! $(pgrep -f a1.php) ]]
在这种情况下可能有效,但[[ $(pgrep -f a1.php) ]]
如果多个进程匹配就会失败,因此它很脆弱。
尝试,
if [[ $(pgrep -c -f a1.php) -gt 0 ]]; then
exit 1
fi
if [[ $(pgrep -c -f a2.php) -gt 0 ]]; then
exit 1
fi
if [[ $(pgrep -c -f a3.txt) -gt 0 ]]; then
exit 1
fi
php -f a.php; php -f b.php; sh -e a3.txt
或者另一种选择
pgrep -f a1.php > /dev/null && exit 1
pgrep -f a2.php > /dev/null && exit 1
pgrep -f a3.php > /dev/null && exit 1
php -f a.php; php -f b.php; sh -e a3.txt
看http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html有关 if 语句的更多信息。