Назад | Перейти на главную страницу

проверьте, запущен ли процесс, даже под cron

У меня есть задание cron, которое выполняется каждую минуту, но если оно находит данные, это может занять много минут.

Мне нужно узнать, запущен ли другой экземпляр скрипта из другого. Чтобы сделать вещи еще более увлекательными, мы вызываем один и тот же сценарий с разными параметрами ... например:

* * * * * /home/user/script.sh Dir1 > /tmp/logdir1.log
* * * * * /home/user/script.sh Dir2 > /tmp/logdir2.log

Я тестировал что-то вроде этого:

FORMAT="`basename $0` $1"
OLDPID=`pgrep -f -o "${FORMAT}"`  #grab the oldest copy of the PID matching this format
echo $OLDPID:$$ 
If [ "$OLDPID" -eq "$$" ]

....

В моем тестировании это отлично работает. Если самый старый PID не совпадает с текущим, значит, работает еще один. однако при запуске из cron процесс появляется дважды, поэтому самый старый pid НЕ является текущим:

user 1094 0.0 0.0 8720 944 ? Ss 12:38   0:00      \_ /bin/sh -c /home/user/script.sh Dir1 > /tmp/logdir1.log
user 1097 0.1 0.0 8856 1236 ?  S 12:38   0:00          \_ /bin/bash /home/user/script.sh Dir1

Итак, мой сценарий каждый раз терпит неудачу, потому что он видит дубликат. есть ли способ сказать pgrep игнорировать первый?

В прошлом у нас были некоторые проблемы с чтением pid-файла, а затем с проверкой, выполняется ли этот процесс. (другие процессы получают один и тот же pid, а разные версии centos, похоже, имеют немного разные параметры PS)

Как бы вы с этим справились?

Используйте стадо, как описано в Перекрывающиеся рабочие места - замки.

Сделайте что-нибудь вроде этого:

#!/bin/bash

pidfile=/var/run/myscript.pid

if [ -f ${pidfile} ]; then # is there already a  pid file?
  oldpid=$(cat ${pidfile})
  ps -p ${oldpid} &> /dev/null # is the process still running?
  if [ $? -ne 0 ]; then
    rm ${pidfile} # pid file is stale, remove it
  else
    echo "Old process still running"
    exit 1
  fi
fi

echo $$ > ${pidfile}

# DO STUFF

rm ${pidfile}