SORU
11 Kasım 2009, ÇARŞAMBA


Bash script sadece 1 kopya çalıştığından emin olmak için en iyi yol?

Verilen komut sadece 1 kopya çalışan linux üzerinde bash varsayarak olduğundan emin olmak için en kolay/en iyi yolu nedir?

Şu an yapıyorum:

ps -C script.name.sh > /dev/null 2>&1 || ./script.name.sh

ama birkaç sorun var:

  1. dosyası dışında bir kontrol koyar
  2. benim istediğim farklı hesaptan aynı script - bazen çalıştırmak izin vermez.
  3. -C süreci adı ilk 14 karakter denetler

Tabii ki kendi pidfile iyi idare yazabilirim, ama bunu yapmak için bazı basit bir yolu olması gerektiğini hissediyorum.

CEVAP
31 Aralık 2009, PERŞEMBE


Danışma kilitleme yaş için kullanılır olmuştur ve bash komut dosyaları kullanılabilir. Basit flock (util-linux[-ng]) lockfile (procmail) tercih ederim. Ve her zaman bu komut çıkış == EXIT 0 belirli sinyalleri yakalama gereksiz sigspec () bir tuzak hakkında unutmayın.

Bir süre önce benim lockable script boilerplate da gist olarak kullanılabilir bıraktım. Bir örnek-kullanıcı başına bu dönüşüm saçmadır. Bunu kullanarak, aynı zamanda kolayca diğer bazı senaryolar kilitleme veya eşitleme gerektiren komut dosyaları yazabilirsiniz.

Burada size kolaylık sağlamak için söz konusu demirbaş.

#!/bin/bash

## Copyright (C) 2009  Przemyslaw Pawelczyk <przemoc@gmail.com>
## License: GNU General Public License v2, v3
#
# Lockable script boilerplate

### HEADER ###

LOCKFILE="/var/lock/`basename $0`"
LOCKFD=99

# PRIVATE
_lock()             { flock -$1 $LOCKFD; }
_no_more_locking()  { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking()  { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }

# ON START
_prepare_locking

# PUBLIC
exlock_now()        { _lock xn; }  # obtain an exclusive lock immediately or fail
exlock()            { _lock x; }   # obtain an exclusive lock
shlock()            { _lock s; }   # obtain a shared lock
unlock()            { _lock u; }   # drop a lock

### BEGIN OF SCRIPT ###

# Simplest example is avoiding running multiple instances of script.
exlock_now || exit 1

# Remember! Lock file is removed when one of the scripts exits and it is
#           the only script holding the lock or lock is not acquired at all.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CruzerLite

    CruzerLite

    1 EKİM 2011
  • hanksranger

    hanksranger

    6 EKİM 2009
  • Vsauce

    Vsauce

    30 Temmuz 2007