如何控制脚本尚未运行?

时间:2014-08-11 23:30:47

标签: shell ps

我有一个由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文件)? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

两个选项:

  1. 允许作业启动,但是如果是,请检查scriptName脚本 已经跑步并自杀了。
  2. 切换到更复杂的 作业调度程序,例如http://nerds.airbnb.com/introducing-chronos/

答案 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"本身会匹配)。