我有一个由cron执行的shell脚本,我想控制它尚未运行。 这是我的对照测试:
set -A processes
ps -elf | grep -v grep | grep -E "/bin/ksh.+scriptName" | while read line ;do processes[${#processes[@]}]="$line";done
if [ ${#processes[@]} -gt 1 ]; then
for i in {0..$((${#processes[@]}-1))}; do echo "${processes[$i]}"; done
exit 1
fi
问题在于此控件有时会返回2个进程(自身):
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
0 S用户12486 12485 0 85 0 - 2469 - 15:30? 00:00:00 / bin / ksh / path / scriptName ARG1
1 D用户12503 12486 0 85 0 - 2469 get_wr 15:30? 00:00:00 / bin / ksh / path / scriptName ARG1
我不明白为什么有时会发生......如何解决这个问题? 如何控制脚本尚未运行(没有“flag”/ semaphore文件)? 谢谢你的帮助!
答案 0 :(得分:0)
两个选项:
答案 1 :(得分:0)
使用管道可以生成子进程,这些子进程显示在进程表中。限制" ps"输出,它变得更容易解析:
ps -eo pid,ppid,args | grep -vw $$ | grep -qE "[0-9]+ /bin/ksh $0" && echo "ALREADY RUNNING"
这将从具有当前PID($$)作为其PID或父PID的列表中删除任何内容,然后将脚本名称作为模式进行匹配。你真的不需要" [0-9] +"在模式中,因为第一个grep排除了所有子进程(否则" grep"本身会匹配)。