Быстрее задержанное выполнение, чем 1 минута?

Вот современный метод Linux:

ip -o link show dev eth0 | grep -Po 'ether \K[^ ]*'

Это современно в этом ifconfig долго удерживался от использования в пользу ip от iproute2 пакет и это grep имеет -P опция для регулярных выражений жемчуга для положительной нулевой ширины оглядывается утверждение.

grep -o хорошо для извлечения текста. sed традиционно используется для этого, но я нахожу утверждения нулевой ширины perl-стиля более ясными, чем sed команда замены.

Вам на самом деле не нужно -o (короткая) опция к ip, но я предпочитаю использовать его при извлечении информации о сети, так как я нахожу это инструментом для очистки, имеющим одну запись на строку. Если Вы делаете более сложные соответствия или извлечения (обычно с awk), -o важно для чистого сценария, таким образом, ради непротиворечивости и общего шаблона, я всегда использую его.

1
10.06.2011, 00:16
4 ответа

Было бы легче просто запуститься, программа непосредственно и иметь его сразу выполняет обновление (или это могло спать для некоторой маленькой задержки при реальной необходимости в нем к).

Если это находится в самом сценарии (например, удар), просто назовите сценарий обновления непосредственно (вероятно, перенаправляющий вывод):

update-my-thingy < /dev/null > /dev/null 2>&1

Если это находится в программе, можно всегда использовать систему (), звонят, чтобы сделать то же самое:

system("update-my-thingy < /dev/null > /dev/null 2>&1");
3
27.01.2020, 23:15
  • 1
    Мой начальный подход должен был вызвать сценарий обновления, как Вы описываете выше. Я думал, что это не работало, потому что дочерний процесс был уничтожен вместе с моим демоном (сценарий обновления уничтожает демона прежде, чем обновить). Могло случиться так, что отказ произошел, потому что мне не удалось перенаправить вывод. добавление –  Jon Trauntvein 10.06.2011, 23:20
  • 2
    я должен был объединить это с nohup, чтобы препятствовать тому, чтобы дочерний процесс завис, когда мой демон был закрыт. –  Jon Trauntvein 13.06.2011, 18:17

Разветвите сценарий, который ожидает в течение нескольких секунд.

{ sleep 5; update-my-program; } &

Если Ваша цель состоит в том, чтобы сделать обновление, как только Ваша программа выходит, но только, примите меры, чтобы Ваша программа завершилась путем вызова execve вместо exit. execve системный вызов заменяет текущую программу другим. В C существует несколько вариантов (execl, execp, и т.д.) в зависимости от того, как Вы хотите передать параметры. В оболочке встроенное соответствие exec.

2
27.01.2020, 23:15

Это зависит от того, что Вы программируете, делает. Для демонов это сделано следующий путь:

  • определите возраст исполняемого файла
  • если возраст является меньше затем программой, запускаются, то исполняемый файл был перезаписан с новой версией
  • в таком случае ожидают, пока нет никакой работы, которая будет сделана (или не делайте),
  • exec() на сам для перезапуска программы с новым двоичным файлом
1
27.01.2020, 23:15

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

% killmenow() { ... }
...
% killmenow
EOF

Это - лучший способ быть уверенным, что все из текущего сценария было полностью считано и скопировано в память. Просто высказывание.

Теперь для моей попытки ответа...

POSIX указывает jobs утилиты для этих видов вещей. А именно, комбинация wait, trap, и kill было бы самым безопасным, я думаю. Для получения вещей, проходящих максимально чисто, можно использовать newgrp также, который является в точности как exec в качествах наследования за исключением, как могло быть основным в этом случае, process id.

Хорошо, таким образом, я знаю, что это походит на много, но это не так для взгляда на, в конце концов:

% suicide() { _me="${1}" ; ( 
>> trap 'wait "${_me}" && set -- &&\
>>> eval `newgrp && exec { YOUR | CMD | HERE }`' INT &&\
>> kill -s INT "-${_me}"
>> ) & }
...
% suicide "${$}"

Хорошо, таким образом, вот рабочий процесс:

  • Сначала мы загружаем и запускаем весь скрипт, и мы уверены в этом, потому что мы не делаем suicide до самой последней строки.
  • Мы передаем suicide копия нашего process id затем сохраните его к $_me, который мы могли столь же легко получить из suicide также в этом случае, но мы могли бы использовать его в другом месте, кто знает.
  • Из подоболочки мы звоним trap просканировать в trapped '$cmd' и дайте этому команду быть в поисках любого слуха INT звонить.
  • Уверенный все готово, наш вызов к kill наше самое последнее; kill проблемы INTERRUPT SIGNAL не только к $_me но мы - укажите это $_my целая группа процесса должна получить его. Не бойтесь - если Ваша целая система не уже безумна - $_me ничего не может уничтожить $_me не должен мочь прямо сейчас так или иначе. Кроме того, Вы не имеете к - укажите это в kill PID аргумент также; я просто пытаюсь быть полным.

Хорошо, но мы не сделаны, правильно? Нет, мы помещаем целый набор команд в a & фоновая подоболочка так trap все еще бродит вокруг и может поймать наш INT звонить.

  • Получив INT, trap ТЕПЕРЬ оценивает 'quoted argument' - важно помнить, что что-либо в этой строке только теперь вытаскивается.
  • На всякий случай $_me имеет несколько других свободных концов для связывания в другом месте, trap первые вызовы wait на $_me который будет оставаться на линии только столько, сколько она должна.
  • Когда готовый, мы вычищаем любого остающегося env $vars с set -- и затем мы приступаем к делу.

newgrp разработан, чтобы быть выполненным в interactive shell - который, как не обязательно предполагают, предоставлял процессу такой чистый Escape как это. На самом деле, если Ваша система group потребуйте паролей - который они не были должны - это не работать на Вас и умрут теперь.

Я называю этот метод подлым ниже, но я выпрямил его из ИНСТРУКЦИЙ POSIX:

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

Затем в следующем абзаце...

Команда newgrp предназначается только для использования от интерактивного терминала. Это не предлагает полезный интерфейс для поддержки приложений.

Таким образом, подлая часть eval, который может быть довольно хорош в такой вещи - как сохранение и многократное использование "$@" например, но другое время, возможно...

  • Вместо этого мы косвенно eval a newgrp && exec оператор, что первые загрузки другой процесс, который, как только предполагается, принимает его следующее управление от интерактивной подсказки, затем мы украдкой exec в черном ходе содержание { YOUR | CMD }.

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

На самом деле мы были так полны, что мы могли безопасно сделать это:

...exec { wget -O - "${URL}" >"${0}" ; exec "${0}" }
0
27.01.2020, 23:15

Теги

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