Почему делает “при” команде, всегда предупреждают меня, что команды будут выполняться через sh?

это в простейшей форме бесконечный цикл с условным выходом?

Нет, это не так. Это неэффективно, а не так, как это обычно делается.

Детали сложны и зависят от системы (см. Ответ @ Karol для ссылок на код), но общий подход заключается в следующем.

Когда поток вызывает wait(), метод выполняет следующее:

  1. Добавляет подробности потока в очередь объекта мьютекса «ожидающие объекты».
  2. Откажитесь от блокировки мьютекса потока.
  3. «Припаркуйте» ветку, сказав ОС, чтобы она усыпила.
  4. ОС находит какой-то другой поток для планирования. Если его нет, оно заставляет ядро ​​переходить в «маломощный» цикл или приостанавливает его или что-то в этом роде. (Это зависит от операционной системы и оборудования.)

Затем, когда другой поток вызывает notify, метод notify делает следующее:

  1. Он удаляет поток из мьютекса. очереди.
  2. Он сообщает ОС, что (ранее) ожидающий поток должен быть разбужен.
  3. Он возвращается из вызова notify() и (надеюсь) снимает блокировку мьютекса.

ОС делает следующее:

  1. Она находит свободный процессор для запуска потока и запускается.
  2. Если ни одно ядро ​​не свободно, ОС добавляет поток в очередь планировщика запускаемых потоков.
  3. Когда поток запускается, он сначала пытается повторно получить блокировку мьютекса ... что может привести к его возвращению в спящий режим, если какой-то другой поток все еще удерживает блокировку.
  4. Наконец, возвращается вызов wait, и поток обычно перепроверяет переменную условия, а затем снимает блокировку.

Дело в том, что (как правило) не существует бесконечных циклов, которые потребляют процессор, пока поток ожидает.


Какой наименее ресурсоемкий способ ожидания запроса, который заставил меня спросить об этом.

Наименее ресурсоемким способом будут Object.wait и Object.notify ...

13
задан raldi 8 October 2008 в 19:58
поделиться

3 ответа

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

т.е.

username@hostname$ at 23:00     
warning: commands will be executed using /bin/sh
at> rm **/*.pyc
at> <EOT>
job 1 at 2008-10-08 23:00

Использование '**' существует совершенно допустимый zsh, но не/sbin/sh! Легко сделать эти ошибки, если Вы привыкли использовать другую оболочку, и это - Ваша обязанность не забыть делать правильную вещь.

12
ответ дан 1 December 2019 в 22:24
поделиться

Если Вы хотите обойти то сообщение, иметь 'в' запущенном скрипт, который называет указанную среду, будьте им ksh, удар, csh, zsh, жемчуг, и т.д.

дополнение - видит 'в' странице справочника http://www.rt.com/man/at.1.html для получения дополнительной информации.

at and batch read commands from standard input or a specified  file which are to be executed at a later time, using /bin/sh.
2
ответ дан 1 December 2019 в 22:24
поделиться

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

Теперь, если Вы хотите просто не, видят его, можно использовать во [время] 2>/dev/null для отсылки его к забвению, но, к сожалению, в>, подсказки печатаются к STDERR по некоторым причинам (ошибка, IMO - они действительно должны перейти к STDOUT), таким образом, они также скрыты этим. Может быть возможно обработать некоторую инфраструктуру оболочки, которая устранит предупреждение, также не съедая подсказки, но a) моя попытка этого (во [время] 2> &1 | grep-v предупреждение) не работает и b) даже если можно найти комбинацию, которая работает, это не подойдет для искажения (так как время проходит в середине, а не в конце), таким образом, Вы должны будете или ввести его полностью каждый раз, когда Вы используете его или иначе пишете сценарий обертки вокруг в обработать его.

Так, если это не вызывает фактические проблемы, я сказал бы, что Вы являетесь, вероятно, лучшими от просто игнорирования предупреждения как остальная часть нас.

5
ответ дан 1 December 2019 в 22:24
поделиться
Другие вопросы по тегам:

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