Как убить pid на основе результата оператора if

315
FabioEnne

Я пытаюсь перезапустить программу, если с ней связан только один pid (у него должно быть два pid). если у него более одного, это нормально, я пытался написать bash-скрипт для этого, но я изо всех сил стараюсь заставить его работать правильно, это мой код, так что, кто-нибудь может мне помочь в достижении моей цели?

#! /bib/bash pgrepRes=($(pgrep deluge)) if ["${#pgrepRes[@]}" -ne "2"]; then kill $; fi deluge 

но я получаю этот результат:

Как видите, я проверил, сколько pid связано с Deluge.

Заранее спасибо, надеюсь, я прояснил себя достаточно, иначе спрашиваю :)

0
Попробуйте `$ (pgrep deluge | wc -l)`. Он должен дать вам количество строк и `pkill deluge` внутри оператора if. Добавьте пробел `[что бы то ни было]`. Никогда `[без пробелов]` Hastur 8 лет назад 0
@Hastur Вы можете изменить мой код с ответом, пожалуйста? Спасибо FabioEnne 8 лет назад 0
Когда что-то не работает, разбейте его на составные части. Ваша проблема - отсутствие пробелов вокруг `[` и `]`. Это не имеет ничего общего с вызовом `kill`. a CVn 8 лет назад 0
Я полагаю, это не соответствует вашей цели, даже `-ne 2`. Вы должны использовать `-lt 2` _less then_, а не _not equal_` -ne` ... Вы должны найти полезное для получения вдохновения;) _ из [Руководства для начинающих Bash] (http://tldp.org/LDP /Bash-Beginners-Guide/html/sect_07_01.html). Hastur 8 лет назад 0

1 ответ на вопрос

0
Hastur

There are some missprints. Try something like this

#!/bin/bash pgrepN=$( pgrep deluge | wc -l ) if [ "$pgrepN" -lt "2" ]; then echo "less then 2" # pkill deluge echo here restart deluge # restart only if there were less than 2 fi 

Note that in the shebang (first line) you should not put a space between #! and the path of the shell, with the test operator [] you need to put spaces inside the brackets: for example this is [ OK ] this in [NOT OK].
If I properly understand your purpose you want to restart only if there are less than 2 occurrences, so inside the IF statement.


Update:

#!/bin/bash Time_to_Sleep="5m" # Put here the amount of time DKiller="/tmp/Kill_Deluge_Script.sh" # Put here the deluge killer script Name echo "#!/bin/bash" > $DKiller # Creating script that will kill this one echo "kill $$; sleep 3s; " >> $DKiller # Passing the command to kill this one echo "pkill deluge" >> $DKiller # Now you can kill deluge too echo "echo deluge killed... RIP " >> $DKiller chmod u+x $DKiller # Make the script executable for you while true do pgrepN=$( pgrep deluge | wc -l ) if [ "$pgrepN" -lt "2" ]; then echo "less then 2" # pkill deluge echo here restart deluge # restart only if there were less than 2 fi sleep $Time_to_Sleep done 
Оно работало завораживающе! большое спасибо! Теперь моя следующая задача - подключить его к заданию cron, которое выполняется каждые 5 минут! FabioEnne 8 лет назад 0
Я сохранил сценарий в файле .sh и отредактировал crontab (через crontab-e) и установил его выполнение каждые 5 минут. Я также даю разрешение на выполнение chmod 775, но, похоже, не работает таким образом. ... если я копирую и вставляю скрипт прямо в оболочку, он работает нормально .. Я знаю, что crontab работает правильно ... есть идеи? FabioEnne 8 лет назад 0
Так как я полагаю, что вам не нужно каждый раз запускать поток, но как только вы запустите, вы хотите, чтобы он заработал, я предлагаю не трогать _crontab_ и включать вышеуказанный скрипт в бесконечный цикл с `sleep 5m` внутри цикла и с помощью `echo" kill $$> /tmp/Kill_Deluge_Script.sh "` и `echo" pkill deluge ">> / tmp / Kill_Deluge_Script.sh` перед самим циклом, так что при желании вы можете убить Deluge ... Hastur 8 лет назад 0
Я могу понять, как можно реализовать то, что вы написали ... вы можете помочь мне редактировать приведенный выше код? FabioEnne 8 лет назад 0
@FabioEnne Вы должны попытаться сказать, где вы остановились. Кстати, прежде чем делать вашу попытку и после проверки, если это работает (я не сделал). Hastur 8 лет назад 0