Script shell avec une tâche cron pour démarrer un programme s’il n’est pas en cours d’exécution?

Je suis nouveau sur unix / linux et j’ai besoin d’un script shell pour lancer un programme s’il n’est pas en cours d’exécution. Le nom du programme est “literaail” et il contient un journal “/local/publish/mtc_preprint/util/Literail.log” sur un serveur. Ce programme est supposé imprimer ce “démarrage de vérification FTP pour Get_Job1”. déclaration une fois toutes les 30 secondes. Si ce n’est pas le cas, j’ai besoin d’un script shell pour démarrer le processus. Actuellement je le fais manuellement en utilisant ces commandes:

ps -ef | grep ftp_util_mtc_pp.sh ps -ef | grep literail ( this command lists the jar file related to the literail program) kill "parentjobnumber" "childjobnumber" ./ftp_util_mtc_pp.sh & ( this command restarts the process ). 

J’ai un fichier “ftp_util_mtc_pp.sh”, à l’intérieur de ce fichier, j’ai les commandes suivantes:

 #!/bin/bash utildir="/local/publish/mtc_preprint/util" cd $utildir java -jar LiteRail_3.0.1.jar literail.properties > /dev/null 2>&1 exit 

Quelqu’un peut-il m’aider avec le script shell. Je vous remercie.

Ce fichier trouve le fichier jar LiteRail en cours d’exécution s’il est exécuté, il le tuera et le réexécutera, il ne suffit pas de lancer le fichier jar et d’append les journaux à l’emplacement indiqué.

ftp_util_mtc_pp.sh est:

 #!/bin/bash PID= ps -ef | grep LiteRail_3 if [[ -z "$PID" ]]; then #process is running so we kill it Kill -9 PID fi #running the jar file you nohup java -jar /local/publish/mtc_preprint/util/LiteRail_3.0.1.jar literail.properties > /local/publish/mtc_preprint/util/Literail.log 2>&1 & 

j’espère que celui-ci aide.

Il existe deux façons courantes de le faire:

Vous enregistrez le pid de votre processus et l’enregistrez dans un fichier.

 #!/bin/bash pf='/home/abc/pidfile' if kill -0 $(< "$pf"); then # process in pidfile is yours and running exit 0 else echo "starting process" echo $$ > "$pf" exec ftp_util_mtc_pp.sh fi 

Une autre façon serait d’utiliser ps et grep pour vérifier le processus en cours d’exécution:

 #!/bin/bash if ps -u $UID | grep 'LiteRail_3.0.1.jar' >/dev/null 2>&1; then # process is running exit 0 else echo "starting process" exec ftp_util_mtc_pp.sh fi 

Assurez-vous que le processus est détecté correctement par le ps | grep ligne de ps | grep .

Si vous avez installé pgrep:

 pgrep -fl -U $UID 'LiteRail_3.0.1.jar' 

Au lieu de:

 ps -ef | grep ftp_util_mtc_pp.sh 

Utilisation:

 pgrep ftp_util_mtc_pp.sh 

Cela évitera le problème de votre propre commande grep tant que processus. Vous pouvez également spécifier un utilisateur particulier:

 pgrep -u $user ftp_util_mtc_pp.sh 

Cependant, comme votre script shell exécute principalement un fichier jarfile, vous devriez le rechercher:

 pgrep -u $user -f "LiteRail_.*\.jar" 

Le -f indique qu’il faut rechercher l’expression régulière dans la chaîne de commande entière.

Maintenant, nous avons cela à l’écart, parlons des crontabs . Une crontab est une commande que vous pouvez spécifier à quelle fréquence vous souhaitez l’exécuter. Vous placez la commande dans votre crontab et elle peut s’exécuter une fois par minute.

Vous pouvez créer un script pour vérifier si votre commande java est en cours d’exécution et si elle ne redémarre pas. La sortie standard est envoyée à votre adresse, vous pouvez donc la redirect vers un fichier journal ou vers /dev/null .

La procédure d’exploitation standard consiste à capturer l’ID de processus du processus que vous souhaitez vous assurer, puis à vérifier si cet identifiant de processus est toujours opérationnel. Sinon, redémarrez le travail. Vous pouvez capturer l’identifiant du processus en regardant le $! variable d’environnement après avoir démarré votre travail et le lancer en arrière-plan.