1. bash / Говнокод #5734

    −131

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

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

    Запостил: xaionaro, 21 Февраля 2011

    Комментарии (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()", спасибо, буду знать.
                Ответить
          • Мда. У нас, кажется, как раз такие сервера — без перла. Но точно не скажу, надо посмотреть точнее.
            Ответить
        • >> Perl есть всё-таки не везде
          ыы))))) ping тоже
          Ответить
          • Стоит всё-таки признать, что ping есть чаще, чем perl.
            Ответить
            • вообще говоря да
              если Вы на сервере по ssh, то там наверняка есть tcp/ip
              а раз есть ip, значит есть и пинг
              Ответить
        • Вот, у меня джентушные машины, и я ужасно не хочу видеть перл. Но, сцуки, он автотулзам нужен:(
          Ответить
    • //можно быстро ткнуть в клавишу pause break
      Ответить
      • Это из скрипта, запускаемого incron-ом ;)
        Ответить
      • Вы натолкнули меня на хорошую идею.

        Оказалось, работает "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 не понимает дробных чисел и как-то вбил себе это в голову.
        Ответить
    • sleep 0.5 # Или я что-то не понял?
      Ответить

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