Страница 1 из 1

Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-16 20:46:06
Гость
Есть скрипт на базе rsync, который запускается по cron каждые 10 минут. Если размер файла большой и он не успевает скачаться за 10 мин, то запускается 2-я копия rsync (были случаи когда их висело порядка 30 штук.). Вопрос-как должна выглядеть строка (скрипт), которая проверяет наличие в процессах уже запущенного rsync и не давать запускаться новой копии rsync?

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-16 20:49:20
paradox

Код: Выделить всё

ps ax | grep rsync | wc -l
?

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-16 20:51:46
zg

Код: Выделить всё

pgrep rsync > /dev/null && exit

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-16 20:52:11
f_andrey
по моему лучше создавать pid файл, ну и соответственно если он уже существует то не запускать последующие процессы.

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-16 21:08:42
Гость
Создавать PID - не сложновато будет для cronа, сначало создать, затем очистить?
В принципе pgrep rsync > /dev/null && exit будет достаточно.

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-17 2:32:39
Гость
lockf(1)

Код: Выделить всё

lockf -t0 /tmp/.mylock rsync foo dest::
lockf(1) писал(а):-t seconds
...
A timeout of 0 may be given, in which case lockf will fail unless it can acquire the lock immediately. When a lock times out, command is not executed.

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-17 9:22:30
Гость
Debian
lockf: command not found

apt-cache search lockf
checksecurity - basic system security checks
chiark-utils-bin - chiark system administration utilities
cron - management of regular background processing
liblockfile-dev - Development library for liblockfile.
liblockfile-simple-perl - Simple advisory file locking
liblockfile1 - NFS-safe locking library, includes dotlockfile program
libpam-foreground - create lockfiles describing which users own which console
libposixlock-ruby - posix locking for ruby
libposixlock-ruby1.8 - posix locking for ruby
lockfile-progs - Programs for locking and unlocking files and mailboxes
nwall - version of wall that uses GNU readline
python-myghtyutils - Set of utility classes used by Myghty templating
sendmail - powerful, efficient, and scalable Mail Transport Agent
sendmail-bin - powerful, efficient, and scalable Mail Transport Agent

В каком пакете он идет?

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-17 9:32:37
f_andrey
Гость писал(а):В каком пакете он идет?
Здесь на форуме по дефолту обсуждают FreeBSD, в иных случаях имейте совесть хоть вставлять uname.
А по тому где идет у меня например идет с системой /usr/bin/lockf (FreeBSD-CURRENT), или вы не можете найти к какому пакету пренадлежит файл в вашей системе :oops:

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-17 19:31:33
Гость
Ну так в самом начале специально написал - Debian, если надо uname: Linux 2.6.26-1-686, Lenny.
Самостоятельного файла в системе нет, он идет в компекте с каким-то пакетом, список которых привел выше. Не ставить же их все сразу.

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-18 0:06:41
Гость
Гость писал(а):Самостоятельного файла в системе нет, он идет в компекте с каким-то пакетом, список которых привел выше. Не ставить же их все сразу.
ставь по очереди пока не найдешь нужный по функционалу как lockf(1)

а так можно использовать .pid-файлы как замену файловым lock'ам

Код: Выделить всё

#! /bin/sh
# crontab(5) example:
#     */10 * * * * root block routine rsync foo dest::

name=${1:?usage: ${0##*/} name command}
pidfile=/tmp/$name.pid

shift
read 2>/dev/null <$pidfile pid

# launch command if another instance isn't alive anymore
if ! ps -p $pid >&- 2>&-; then
    eval "$@" &
    echo >$pidfile $!
fi
где внешних команд всего две: ps (для проверки жив ли процесс) и rsync (command).

Код: Выделить всё

$ block
usage: block name command
$ block yesflood yes \>/dev/null
$ ps -lp$(pgrep yes)
  UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
 1001 29651 29650   0 118  0  4748   796 -      R      6    0:59.63 yes
$ block yesflood yes \>/dev/null
  UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
 1001 29651 29650   0 118  0  4748   796 -      R      6    1:18.68 yes
$ cat /tmp/yesflood.pid
29650

Re: Как решить задачу-не запускать лишний процеcс.

Добавлено: 2009-04-18 18:40:19
Гость
Посмотрел как реализован запуск системных скриптов, решил остановиться на start-stop-daemon. Единственный вопрос: как прописать параметры (пути и ключи, после --exec $DAEMON) rsync в этом скрипте или сослаться на файл конфигурации, где они будут прописанны?

Код: Выделить всё

 
DAEMON=/usr/bin/rsync 
start-stop-daemon --start --oknodo --quiet --pidfile $PIDFILE --make-pidfile --background --exec $DAEMON  > /dev/null