Использует “в то время как верный” для хранения сценария живым хорошая идея?

Я думаю, что расширение истории могло бы быть очень полезным здесь. Например, ввод !p выполнит последнюю команду, запускающуюся с 'p'. Так же !vi выполнит последнюю команду, запускающуюся с 'vi', и так далее.Более подробная информация. Если Вы не уверены, кто из тех был последним, можно установить опцию оболочки histverify (shopt -s histverify), таким образом, можно все еще отредактировать (или осмотреть), команда перед выполнением ее. Больше на этом здесь.

С другой стороны, можно использовать функциональность поиска истории. В ударе, хите Ctrl+R и введите команду, которую Вы хотите найти в истории (запускающийся с нового, который соответствует критериям). Удар Ctrl+R repeateadly затем возвратит более старые команды, которые соответствуют Вашим критериям. Больше информации здесь и здесь

Если Вы увлечены, можно изменить inputrc readline, такой, что/стрелки вниз делают история ищет Вас. Больше информации здесь и здесь.

20
01.04.2015, 16:10
9 ответов

, что зависит от того, насколько быстро возвращается сценарий Perl. Если он быстро возвращается, вы можете захотеть вставить небольшую паузу между выполнениями, чтобы избежать нагрузки CPU, например:

while true
do
  /someperlscript.pl
  sleep 1
done

Это также предотвратит загрузку CPU, если сценарий не найден или сбивает сразу.

Структура также может быть лучше реализована в сам сценарий Perl, чтобы избежать этих проблем.

Отредактируйте:

Как вы написали только цель цикла, состоит в том, чтобы перезапустить сценарий Perl, если он сбивает, лучший подход будет реализовать его в качестве контролируемого сервиса, но точный способ сделать это зависимость ОС. Например: Solaris SMF, Systemd Linux или RESTARTER на основе CRON.

21
27.01.2020, 19:43

в то время как Loop действительно не очень хорошая идея. Там нет побега - это просто работает навсегда - статически . Любое количество вещей может измениться в окружающей среде, и оно не будет затронуто - и это может быть плохо.

Например, если исполняемый файл оболочки несет ответственность за это , в то время как цикл , в то время как будет обновляться. Долго, как это работает. И это верно для любых файлов, что оболочка может открыться по любой причине запустить цикл - все они будут проведены с помощью этого , а цикл так долго, как он работает - навсегда.

А если небес запрещают, есть утечка памяти в любом месте раковины, бегущей к тому, что петля - даже большая минута - она ​​просто продолжит утечку - статически . Он построит не проверку и единственный пригрев - это насильно убить его, а затем начать его, просто чтобы сделать то же самое позднее.

Это действительно не так, как вы должны настроить по фиксированному процессу - по крайней мере, не на мой взгляд. Вместо этого, как я думаю, должен быть точка сброса - обновление скрипта и его состояние. Самый простой способ сделать это с Exec . Вы можете заменить текущий процесс с новым - при сохранении одного и того же PID - но все еще используя новый процесс .

Например, если ваш скрипт Perl должен вернуть true после того, как он успешно обрабатывал модификацию файла в некотором контролируемом каталоге:

#!/bin/sh
trap 'rm -rf -- "${ldir%%*.}"' 0 INT
_exec() case    $#      in
        (0)     exec env -  "PID=$$" "ldir=${TMPDIR:-/tmp}/." \
                            "$0" "$@";;
        (*)     export "$@" "boff=0" "lmt=30"
                exec        "$0" "$@";;
        esac
[ "$PID" = "$$" ] || _exec
[ -w "$ldir" ]  &&
case    $ldir   in
(*.)    until   mkdir -- "$ldir"
        do      :& ldir=$ldir$$$!
        done    2>/dev/null
;;
(*)     until   /someperlscript.pl ||
                [ "$((boff+=1))"  -ge "$lmt" ]
        do      [ -d "$ldir" ]     &&
                sleep "$boff"      || ! break
        done
;;esac  &&      _exec ldir PID

... или что-то в этом роде. То, что позволяет основным механизмам за циклом, чтобы обновить время от времени обновляться.

2
27.01.2020, 19:43

, переместите время 1 в скрипт Perl (следуя предложение @roaima)

#!/usr/bin/perl

 use Linux::Inotify2;

 my $inotify = new Linux::Inotify2 or die "unable to inotify: $!";

 $inotify->watch ("Dir", IN_MODIFY, ## or in_{acess,create,open, etc...}
   sub { my $e = shift;
     my $name = $e->fullname;
     ## whatever 
     print "$name was modified\n" if $e->IN_MODIFY;
  });

 1 while $inotify->poll;
4
27.01.2020, 19:43

Вы хотите управлять процессом, вы можете посмотреть в менеджер процесса для этого.

Со многими недавними системами вы можете использовать SystemD для мониторинга ваших процессов (что является одним из преимуществ SystemD по классическим сценариям инициатива). Если ваш дистрибутив выбора не использует Systemd, вы можете использовать Daemontools или Монись .

2
27.01.2020, 19:43

В то время как true в порядке, в качестве общего назначения "цикла навсегда". Как говорят другие ответы, тело петли не должно быть пустым или становится пустым в силу команды внутри цикла не работает.

Если вы используете Linux, вы можете использовать команду, такую ​​как inotifywait , что делает , в то время как Ploot намного проще:

while inotifywait -qqe modify "$DIRECTORY"
do
    process_the_directory "$DIRECTORY"
done

здесь inotifywait Команда будет сидеть и дождаться, когда произойдет событие файловой системы (в этом примере, когда файлы в каталоге записываются на). В этот момент он выходит успешно, и тело цикла выполняется. Затем он восходит к ожиданию снова. Поскольку команда inotifywait команда ждет чего-то, что произойдет в каталоге, это гораздо более эффективно, чем постоянно опросить каталог.

11
27.01.2020, 19:43

В целом нет проблем с использованием , поскольку это True , поскольку это крошечный тест, который выполняется только после того, как скрипт Perl заканчивается. Имейте в виду, что в зависимости от того, какой вариант Linux / Unix вы используете, скрипт может быть прекращен при выключении. В таком случае рассмотрим использование цикла в сценарии и называть его NOHUP и поместите его в фоновом режиме IE NOHUP MyScript &

, если сценарий PERL заканчивается слишком часто и вызывает нагрузку на процессор, чем это Нагрузка подотчетна сценарию Perl, а не , в то время как true .

См. Также Человек Nohup для деталей.

2
27.01.2020, 19:43

Другие ответы об использовании инотифицируют , правильные, но не ответ на этот вопрос.

Руководитель процесса, например, , , старт-старт или runit , предназначен именно для решения проблемы просмотра и перезапуска службы в случае ее сбоя.

Ваш дистрибутив, вероятно, поставляется со встроенным супервайзером процесса.

14
27.01.2020, 19:43

Когда ваш скрипт на perl предназначен для постоянной работы, зачем использовать его при построении? Когда perl не удается в виду некоторых серьезных проблем, новый сценарий perl, начатый в то время может крах так же сильно. Снова и снова и так далее.
Если вы действительно хотите, чтобы ваш perl начал заново, подумайте о crontab и сценарии, который сначала проверяет на наличие запущенных экземпляров. Таким образом, ваш скрипт будет даже запущен после перезагрузки.

3
27.01.2020, 19:43

Я проголосовал за несколько из этих ответов, но инстинктивно испытываю самые теплые чувства к ответу @ WalterA. Ну, я делал, пока не создал свой собственный ответ ...

Лично я бы хотел обновить сценарий Perl, чтобы он записывал в журнал описательную запись об ошибке и отправлял предупреждение администратору.

Если сценарий Perl предназначен для продолжения работы, ожидая событий изменения от файловой системы, почему он дает сбой?

Если он не дает сбоя, почему вы беспокоитесь о том, чтобы обернуть его в сценарий, чтобы перезапустить его? бесконечно?

Если есть проблема с конфигурацией или некоторая неработающая зависимость, которая приводит к прерыванию сценария Perl, простой перезапуск его снова и снова вряд ли заставит его внезапно начать работать.

Вы ведь знаете определение безумия? (делать одно и то же снова и снова, ожидая другого результата). Просто говорю. ; -)

1
27.01.2020, 19:43

Теги

Похожие вопросы