SORU
8 ŞUBAT 2009, Pazar


Nasıl unix keyfi bir komut daemonize?

Keyfi olarak, genel bir komut dosyası açmak veya daemon bir komut bir daemonizer istiyorum.

Uğraşmak istiyorum iki genel durum vardır:

  1. Sonsuza kadar çalışan bir komut dosyası var. Eğer şimdiye kadar ölürse (veya yeniden başlatma), yeniden başlatın. Hiç izin yok iki kopyası aynı anda çalışan bir kopyasını tespit çalışmakta ve bu durumda atmıyorsun) olma.

  2. Tekrar tekrar sonsuza dek (çalışan arasında kısa bir duraklama ile) yürütme devam etmek istiyorum bu kadar basit kod veya komut satırı komut var. Yine de, bu script iki kopyası hiç aynı anda çalışması için izin vermez.

Elbette önemsiz yazmak bir "while(true)" döngü etrafında senaryo durumunda 2 ve sonra da geçerli bir çözüm için durum 1, ama daha genel bir çözüm olacak sadece çözmek 2 durumda doğrudan yana bu geçerlidir senaryoyu diye 1 de (sadece bir kısa veya Duraklat eğer senaryo değil amaçlanan hiç ölmeden (tabi eğer senaryo gerçektenyokpause aslında bir önemi yok o zaman asla ölmez).

Çözüm içermelidir unutmayın, dosya kilitleme ekleme kod söylemek veya PID varolan komut dosyalarını kaydetme.

Daha spesifik olarak, bir program" gibi koşabilirim. "daemonize istiyorum

% daemonize myscript arg1 arg2

ya da, örneğin,

% daemonize 'echo `date` >> /tmp/times.txt'

tarih büyüyen bir liste times.txt eklenen dururdu. (Eğer(s) daemonize bağımsız değişkeni sonsuza dek durum 1'de yukarıdaki gibi çalışan bir script ise daemonize hala doğru şeyi, gerektiğinde yeniden yapacak unutmayın.) O zaman benim yukarıdaki gibi bir komut koyabilirim .giriş ve ya saatlik ya da inceden inceye (nasıl bir endişe içinde beklenmedik bir şekilde ölmek üzereydim bağlı olarak)/cron.

NB: daemonize senaryo aynı komut dizesini tekrar daemonized ise ikinci bir kopyasını başlatmak değil bu yüzden daemonizing bu komut dizesini hatırlamak gerekir.

Ayrıca, çözüm için ideal bir OS X ve linux ama çözümleri de çalışması gerekir veya diğer bekliyoruz.

EDİT: eğer sudo daemonize myscript myargs ile çağırmak için varsa iyi.

Tüm yanlış düşünüyorum ya da hızlı-ve-kirli kısmi çözüm vardır, o da duymak isterim.)


Yararlı, here's benzer bir soru python için belli olmasın diye. PS:

Ve benzer bir soru this cevap rasgele bir komut dosyası hızlı ve kirli bir kötülüyorlar için yararlı bir deyim gibi görünen vardır:

CEVAP
11 Mart 2010, PERŞEMBE


Nohup kullanarak Unıx herhangi bir yürütülebilir daemonize ve & operatörü:

nohup yourScript.sh script args&

Nohup komutu bir kabuk oturuma devam etmek için sizden, bu yüzden bir süre script öldürme, ve arka planda komut yerlerde olmadan kabuk oturumu kapatma sağlar. Bu standart çıktı ve standart hata gönderilen hem de sadece küçük bir sorun var.nohup.eğer bu malikanede birkaç komut başlarsanız, bu yüzden onların çıkış iç içe olacak. Daha iyi bir komut olabilir:

nohup yourScript.sh script args >script.out 2>script.error&

Bu standart, seçtiğiniz dosya ve seçtiğiniz başka bir dosya için standart hata göndereceğiz. Eğer her iki standart ve standart hata için sadece tek bir dosya kullanmak istiyorsanız, yapabilirsiniz bize bu:

nohup yourScript.sh script args >script.out 2>&1 &

2>&1 standart olarak aynı dosya için standart hata (açıklayıcı 2 dosya) yönlendirmek için dışarı kabuk söyler (tanımlayıcı 1 Dosya).

Bir komut sadece bir kez çalıştırmak için bu komut dosyasını kullanabilirsiniz ölürse yeniden:

#!/bin/bash

if [[ $# < 1 ]]; then
    echo "Name of pid file not given."
    exit
fi

# Get the pid file's name.
PIDFILE=$1
shift

if [[ $# < 1 ]]; then
    echo "No command given."
    exit
fi

echo "Checking pid in file $PIDFILE."

#Check to see if process running.
PID=$(cat $PIDFILE 2>/dev/null)
if [[ $? = 0 ]]; then
    ps -p $PID >/dev/null 2>&1
    if [[ $? = 0 ]]; then
        echo "Command $1 already running."
        exit
    fi
fi

# Write our pid to file.
echo $$ >$PIDFILE

# Get command.
COMMAND=$1
shift

# Run command until we're killed.
while true; do
    $COMMAND "$@"
    sleep 10 # if command dies immediately, don't go into un-ctrl-c-able loop
done

İlk argüman pid dosyasının adını kullanmaktır. İkinci argüman komut. Ve diğer tüm argümanları komut bağımsız değişkenleri.

Eğer bu senaryo restart.sh adı bu arama nasıl:

nohup restart.sh pidFileName yourScript.sh script args >script.out 2>&1 &

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CNNMoney

    CNNMoney

    16 Kasım 2006
  • finalcall07

    finalcall07

    11 NİSAN 2008
  • VvCompHelpvV

    VvCompHelpvV

    4 EYLÜL 2007