我试图阻止脚本同时由多个用户运行,并且不想使用仅在某些操作系统或shell(pgrep,pidof,...)上可用的命令,并且遇到了一个问题我不确定这是不是一个错误......
请忽略我在脚本中使用的细节:问题是关于使用ps时bash中的命令替换。
当我运行以下内容时(注意ksh中的shebang):
#!/bin/ksh
CMD=`basename $0`
echo $CMD
ps -ef | grep "$CMD"
ps -ef | grep "$CMD" | wc -l
RUNS=`ps -ef | grep "$CMD" | wc -l`
echo $RUNS
if [ $RUNS -gt 2 ]; then
echo The script is currently being run by another user.
#exit 1
fi
RUNS=`ps -ef | grep "$CMD"`
echo "$RUNS"
RUNS=`echo "$RUNS" | wc -l`
echo $RUNS
if [ $RUNS -gt 2 ]; then
echo The script is currently being run by another user.
#exit 1
fi
ps -ef | grep "$CMD" | wc -l > lock
RUNS=`cat lock`
echo $RUNS
if [ $RUNS -gt 2 ]; then
echo The script is currently being run by another user.
exit 1
fi
我得到了正确的输出:
testksh.sh7
abriere 19126 5669 0 14:15 pts/21 00:00:00 /bin/ksh ./testksh.sh7
abriere 19129 19126 0 14:15 pts/21 00:00:00 grep testksh.sh7
2
2
abriere 19126 5669 0 14:15 pts/21 00:00:00 /bin/ksh ./testksh.sh7
abriere 19137 19126 0 14:15 pts/21 00:00:00 grep testksh.sh7
2
2
我在用bash替换shebang并相应地重命名脚本后得到这个:
testbash.sh7
abriere 5631 5669 0 14:12 pts/21 00:00:00 /bin/bash ./testbash.sh7
abriere 5634 5631 0 14:12 pts/21 00:00:00 grep testbash.sh7
2
3
The script is currently being run by another user.
abriere 5631 5669 0 14:12 pts/21 00:00:00 /bin/bash ./testbash.sh7
abriere 5643 5631 0 14:12 pts/21 00:00:00 /bin/bash ./testbash.sh7
abriere 5645 5643 0 14:12 pts/21 00:00:00 grep testbash.sh7
3
The script is currently being run by another user.
2
注意ps输出中的额外行。
bash中的以下行:
RUNS=`ps -ef | grep "$CMD" | wc -l`
不会返回与:
相同的值ps -ef | grep "$CMD" | wc -l
Ksh没有这个问题。
正如您所看到的,有一些解决方法:我在脚本的最后一部分使用了一个。
我在Linux,AIX和SunOS上运行脚本,他们给了我相同的结果;只有Cygwin没有,但ps命令不会在任何一个shell中返回脚本。
这是一个错误吗?即使bash在子shell中运行命令替换(参见问题21331042),我仍然认为分配了命令替换值的变量应该返回与命令本身相同的值...