2010-06-04 12 views
2

J'ai un démon qui, lorsqu'il est démarré, charge ses données depuis un répertoire qui se trouve être un lien symbolique. Périodiquement, de nouvelles données sont générées et le lien symbolique mis à jour. Je veux un script bash qui vérifiera si le lien symbolique actuel est le même que l'ancien (avec lequel le démon a démarré) et si ce n'est pas le cas, redémarrez le démon. Ma pensée actuelle est:Vérifie si un lien symbolique a changé

if [[ ! -e $old_dir || $(readlink "$data_dir") == $(readlink "$old_dir") ]]; 
then 
    echo restart 
    ... 
    ln "$(readlink "$data_dir")" "$old_dir" -sf 
else 
    echo no restart 
fi 

L'exigence abstraite est: chaque fois que le script est exécuté, il doit vérifier si un lien symbolique sur un chemin donné pointe maintenant à une autre chose que ce fut la dernière fois, et si oui faire quelque chose. (L'alternative serait de vérifier si les données sur le chemin a changé, mais je ne vois pas que tout être plus propre.) Mes questions:

  • Est-ce une bonne approche?
  • Quelqu'un a-t-il une meilleure idée?
  • Que dois-je utiliser pour $old_dir, où dois-je mettre le lien symbolique?
+0

Pourquoi voulez-vous faire cela? L'idée derrière les liens symboliques est que vous n'avez pas besoin de garder une trace de la destination finale. A l'intérieur de [[]] 'vous n'avez pas besoin d'utiliser les guillemets alors qu'il peut être conseillé de les utiliser avec votre commande' ln'. Il est préférable d'utiliser '$()' au lieu de backticks. Vous devriez utiliser '! =' Au lieu de -ne lorsque vous utilisez '[[]]'. –

+0

@Dennis, édité pour clarifier et fait les changements suggérés. – BCS

Répondre

1

Comme pour une bonne approche, je ne suis pas sûr. On dirait que c'est assez pratique mais bizarre.

je mettrais old_dir dans/var/local/projectname

EDIT: Sans voir assez pour savoir vraiment si vous menant sur le mauvais chemin, je pense en quelque sorte la bonne façon de le faire est d'utiliser spooling répertoires.

La façon dont cela fonctionne est:

  1. Nouveau fichier de travail est créé dans/var/spool/appname/tmp.
  2. fichier est déplacé vers/var/spool/appname (même système de fichiers requis)
  3. fichier est ramassé à partir de/var/spool/appname, traitées et supprimée (ou déplacée si cela est plus approprié)

L'étape 2 est le transfert atomique. L'étape 3 devra peut-être être blindée, donc le traitement du même fichier deux fois est inoffensif.

Ensuite, si vous avez quelque chose comme garder un historique complet et que le lien symbolique fait référence au courant, vous le faites déjà correctement.

+0

Que feriez-vous à sa place? (J'ai ajouté les exigences abstraites) – BCS

+0

Ce n'est pas un système de traitement par lots, c'est un serveur donc le dernier bit est sur la cible. – BCS

0

Votre script devra savoir ce que l'original $old_dir est supposé être. Vous pouvez stocker la valeur dans un fichier dans /var/run/app_name par exemple.

Je ne comprends toujours pas pourquoi vous voudriez faire cela. Pardon.

Edit:

Basé sur le Filesystem Hierarchy Standard, je dirais que /var/lib/appname peut être un endroit approprié pour mettre votre lien symbolique.

+0

Je prévois d'avoir '$ old_dir' codé en dur. – BCS

+0

@BCS: Alors je ne comprends pas "Où devrais-je mettre' old_dir'? " –

+0

/var/run/appname est recréé à chaque démarrage ces jours-ci. – Joshua

Questions connexes