Beri bash i ebash / Говнокод #5734 Ссылка на оригинал

0

  1. 1
ping -q -c 2 -i "0.$ACTN" localhost > /dev/null

Способ заснуть менее чем на секунду, не дописывая для этого отдельную программу Сишную с использованием nanosleep().

Запостил: xaionaro xaionaro, (Updated )

Комментарии (28) RSS

  • perl'ом (который есть почти везде): perl -e 'select(undef,undef,undef,0.250)' - спать 0.25 секунды.
    Ответить
    • Вариант с perl тоже как-то плоховато выглядит:
      1.) Perl есть всё-таки не везде, мне приходится на работе работать с gentoo-шными машинами, где владельцы не хотели бы видеть perl;
      2.) Во-вторых сам "perl" будет запускаться дольше, чем "ping", т.к. он намного тяжеловеснее
      3.) В самой уже perl-овой строке используются опять косвенные способы, а не прямые, select() всё-таки придуман для другого 🙂

      Честно говоря не знаю где наименьшее зло. 🙁
      Ответить
      • Хотя я нагнал, на упомянутых машинах perl стоит 🙂

        Но всё-равно, IMHO, он бывает реже, чем ping понимающий такие флаги.

        С другой стороны, этот ping требует привилегий root-а, что несомненно огромный минус.
        Ответить
      • №1 - перл на линухе стоит всегда. я еще ни одного *них сервера не видел без перла. да, опциональная компонента, но как и баш почти везде есть. и никого не напрягает попросить поставить.

        №2 - старт-ап перла (без модулей) менее 40 миллисекунд. это вам не питоны/жабы/цшарпы. (питон без модулей тоже относительно быстро грузится - но без модулей он весьма бесполезен. среднее время старт-апа без модулей менее 250 миллисекунд колд/20 миллисекунд хот (из файл кэша).)

        №3 - select() единственная POSIX 4 функция (== имплементирована почти везде, даже под Виндами) поэтому да, хоть и выглядит говновато, но это самый портабельный способ доступится к нанослип из скрипта. сам нанослип появился как обязательная функция только в POSIX 6 (в POSIX 5 было опциональной функцией; заменила опциональную БСДшную usleep()).

        > Честно говоря не знаю где наименьшее зло. 🙁

        зло есть то что тебе из скрипта спать надо. слипы нужно в скриптах избегать.
        Ответить
        • 1.) По поводу наличия perl - да, виноват, я нередко туплю, когда пишу только проснувшись или наоборот перед сном;
          2.) Ну а у ping вдвое меньше;
          3.) А чем плох "read -t" для скрипта запускаемого строго по автоматике?

          > зло есть то что тебе из скрипта спать надо. слипы нужно в скриптах избегать.
          sleep используется только в том случае, если два потенциально конфликтующих скрипта начали выполнять кое-какой этап своей работы одновременно. Очень маловероятная ситуация, но тем ни менее надо учесть её.
          Ответить
          • `read -t` это башизм. если работать скрипту только под линухом тогда нормально.

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

            это мне говорит только об одном: то что ты делаешь не предусмотренно в шелл скриптах. пора искать замену, где есть какой либо механизм локов, например теже файл локи (например тот же перл - `perldoc flock` или С).

            PS на линухе можешь еще глянуть man 1 flock - даже для скриптов HPA чего-то сделал.
            Ответить
            • 1.) Не хочется добавлять в этот набор скриптов один perl-овый скрипт, когда всё остальное на bash.
              2.) Даже в рамках этого скрипта по большей части идёт запуск каких-то внешних команд, лично по мне на perl это будет выглядеть немного уродливо. Я привык перл использовать не как язык сценария, а как язык для обработки текстов, а тут именно требуется составить сценарии.

              Резюмируя, я как-то не хотел бы лишь из-за этой проблемы менять язык. Тем более что, как показали ниже, теперь "sleep" умеет понимать нецелые числа.

              А скрипт будет работать только там, где есть xen и drbd, т.ч., наверника, только под linux-ом 🙂

              А за "flock()", спасибо, буду знать.
              Ответить
        • Мда. У нас, кажется, как раз такие сервера — без перла. Но точно не скажу, надо посмотреть точнее.
          Ответить
          • вообще говоря да
            если Вы на сервере по ssh, то там наверняка есть tcp/ip
            а раз есть ip, значит есть и пинг
            Ответить
      • Вот, у меня джентушные машины, и я ужасно не хочу видеть перл. Но, сцуки, он автотулзам нужен:(
        Ответить
    • Вы натолкнули меня на хорошую идею.

      Оказалось, работает "read -t 0.25".
      Спасибо 🙂
      Ответить
        • Скрипт управляет процессами, которые возможны только под linux. Не думаю, что данный подход создаст проблему
          Ответить
          • Для скриптов есть и другие шеллы, кроме баша (например dash). Там read не имеет такой опции.

            Если bash есть не на каждом линуксе, то GNU sleep -- на каждом. Работает даже в busybox.

            Наконец, это просто прямее -- зачем использовать побочный эффект другой команды, если есть специально для этого предназначенная?
            Ответить
            • Я уже ниже дал знать, почему я не использоввал "sleep" ранее, теперь то я уже изменил, конечно, на "sleep". Если надо повторюсь, когда-то давно, когда я хотел сделать что-то похожее, sleep не воспринимал нецелые числа, поэтому приходилось обходиться без него, и я тогда вбил в себе в голову, что sleep умеет работать только с целыми числами.
              Ответить
            • А по поводу башизма, linux без bash я представляю себе куда сложнее, чем linux без perl.
              Ответить
  • А кто мне объяснит за что минусы? По-вашему нормально, когда работоспособность скрипта не работающего с сетью зависит от "/etc/hosts"?

    Да, мне не удалось вчера под конец дня придумать лучше (ненавижу работать по воскресениям) из-за чего так и написал, тем ни менее я не считаю такое явление нормальным.
    Ответить
  • А почему у меня под FreeBSD и Debian `sleep' вполне понимает дробные числа?
    Ответить
    • Historical implementations of `sleep' have required that NUMBER be
      an integer, and only accepted a single argument without a suffix.
      However, GNU `sleep' accepts arbitrary floating point numbers (using a
      period before any fractional digits).
      Ответить
    • Спасибо, приятная новость. Я помню сталкивался когда-то давно с тем, что sleep не понимает дробных чисел и как-то вбил себе это в голову.
      Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8