2016-05-05 6 views
0

Мой скрипт не работает должным образом, когда я выполняю использование только sh, он работал нормально до сегодняшнего дня. Даже в cronjob она использовалась для выполнения без проблем.Сценарий не выполняется должным образом при использовании/bin/sh

/bin/sh process_check.sh 

Но, кажется, выполнить хорошо, когда я исполню используя следующий путь

./process_check.sh 

Script (проверяет, если процесс запущен, выполняет процесс, если он не работает)

#/bin/sh 
    $service=xxx 

    if (($(/bin/ps -ef | grep $service | wc -l) > 1)) 
     then 
     true 
     else 
     echo "$service is not running!!!" 
     /usr/sbin/xxx 
     fi 

Кроме того, любые способы сделать это намного эффективнее? У меня есть скомпилированная программа, которую я пытаюсь обеспечить, всегда работает.

+0

Вместо 'if (($ (/ bin/ps -ef | grep $ service | wc -l)> 1)); то попробуйте гораздо проще: 'if/bin/ps -ef | grep -q $ service; затем ' –

+0

@WilliamPursell. Существует проблема с этим. Даже если '$ service' не запущен, процесс' grep -q $ service' может быть включен в вывод 'ps'. Вот почему код OP запросил '> 1' (то есть два или более). процессов, соответствующих '$ service'. – John1024

+0

Вы хотите выполнить его с помощью Bourne Shell ('sh'), но вы используете' ((....)) 'и' $ (....) ', которые не определены в Bourne. Конечно, если в вашей системе sh связан с bash, эта ошибка не будет очевидна. – user1934428

ответ

1

Одна из проблем, эта линия:

$service=xxx 

Это, вероятно, должно быть:

service=xxx 

Кроме того, следующий по своей сути ненадежны:

(($(/bin/ps -ef | grep $service | wc -l) > 1)) 

Количество процессов нашли это путь в многозадачной системе зависит от случайностей времени. Более надежный подход заключается в использовании pgrep:

pgrep "$service" 

Это будет список ИДП для $service без возможности согласования grep процесса.

Потому что pgrep устанавливает полезный код возврата сам по себе, нет необходимости в математическом тестировании. Таким образом, заменить:

if (($(/bin/ps -ef | grep $service | wc -l) > 1)) 

С:

if pgrep -q "$service" 

где -q говорит pgrep просто установить код выхода без перечисления ИДП на стандартный вывод.

Если ваш pgrep не поддерживает опцию -q, а затем использовать:

if pgrep "$service" >/dev/null 
+0

Спасибо! -q, похоже, не работает для меня, могу ли я просто использовать pgrep «service»? Я использую SH4.1 –

+0

@LeRay OK. Я обновил ответ, что делать, если ваш 'pgrep' не поддерживает' -q'.(Любое умеренно последнее linux должно поддерживать 'pgrep -q'. Если ваша ОС вообще не имеет' pgrep', сообщите мне, и мы можем обсудить альтернативы.) – John1024

1

В первой строке сценария, вы использовали #/бен/ш вместо #/bin/ш!. Когда вы используете ./process_check.sh, он использует/bin/bash вместо/bin/sh.

 Смежные вопросы

  • Нет связанных вопросов^_^