Grep échoue dans le script upstart

J'ai une configuration ascendante pour un service qui doit vérifier l'existence d'un processus sur son démarrage. Cela semble assez facile, mais j'essaie depuis 3 heures de résoudre ce problème et je suis perdu. Le problème semble être que certaines instructions grep conduisent à une sortie du script au démarrage, entraînant une panne lors du démarrage du service. Mais upstart ne bloque rien, il sort du script et est parti.

Voici quelques lignes d'exemple qui déclenchent le problème: Le premier écho et la sortie de grep sont enregistrés, le deuxième écho est enregistré, mais pas la sortie de grep. Après le deuxième démarrage d'écho, il suffit de quitter le script et de s'arrêter. Le problème est d'ajouter l'option -v ou quelque chose d'autre comme l'utilisation de classes regexp comme [[: digit:]]. Il me semble que j'ai besoin d'échapper à certains personnages mais je ne sais pas comment. Un simple -v ou quelque chose comme ça ne fonctionne pas.

script echo grep ps ax | grep "postgres: wal writer process" | grep "grep" echo grep2 ps ax | grep "postgres: wal writer process" | grep -v "grep" end script 

Est-ce que quelqu'un a une idée de ce que je fais mal et comment résoudre le problème?

Comme expliqué dans le manuel , tous les scripts fonctionnent avec sh -e . Cela signifie que toute erreur de commande non gérée met fin au script avec une erreur. Si vous avez un code qui pourrait renvoyer l'échec, vous le coderez comme

 command || true 

Ou l'envelopper dans un état conditionnel ou quelque chose.

Par le passage, votre code est mieux écrit en tant que

 ps ax | grep "[p]ostgres: wal writer process" 

Voir aussi https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

Donc, en résumé, vous recherchiez probablement quelque chose comme

 if ps aux | grep '[p]ostgres: wal writer process' then : already running else : start it up fi 

Maintenant que grep est exécuté dans le cadre d'un conditionnel, une défaillance n'est plus considérée comme non gérée (même si vous n'avez pas d' else clause!) Et donc il fonctionnera en toute sécurité sous set -e .