У меня есть любопытство

Я запускаю bash-скрипт по SSH-соединению, у которого большой вывод на стандартный вывод. влияет ли это на производительность, если я запускаю процесс в фоновом режиме или на переднем плане?

У меня такое ощущение, что работа в фоновом режиме, даже если я все равно вижу вывод stdout, может быть быстрее, потому что сам bash не зависит от задержки SSH. Имеет ли это смысл?

2 ответа2

1

Вы спрашивали о двух случаях, но я думаю, что вам нужен третий:

  1. без фона:

    ssh remotehost
    foo
    
  2. с фоном:

    ssh remotehost
    foo &
    
  3. выход перенаправлен:

    ssh remotehost
    foo > bar
    

Без фона и с фоном не имеет большого значения - bash(1) самом деле ничего не должен делать со стандартным вводом, стандартным выводом или стандартной ошибкой, когда вы выполняете другую программу. bash(1) никогда даже не видит это. Он просто ждет, когда процесс умрет, поэтому он может дать вам еще одно приглашение оболочки.

Когда вы запустите сценарий в фоновом режиме, вы сможете снова очень быстро взаимодействовать с вашим bash(1) , но любой вывод все равно будет проходить через ваш канал ssh(1) , возможно, очень медленно и, возможно, write(2) системные вызовы в вашем ssh(1) клиент может блокировать, вызывая псевдо-терминала он создает для блокирования, в результате чего ваш сценарий блокировать при вызове write(2) Все это идентично первому случаю - единственное отличие состоит в том, что вы можете вводить команды для вашего bash(1) пока скрипт отправляет вам вывод, и, возможно, kill %1 чтобы уничтожить его, или запустить другие службы или что-то еще. Сценарий будет работать с одинаковой скоростью в любом случае.

В третьем случае, когда вы перенаправляете вывод в файл, сеанс ssh(1) больше не является потенциальным узким местом и, следовательно, не потенциальным узким местом для выполнения вашего скрипта. Он может работать довольно быстро, возможно, намного быстрее, чем даже запускаться локально без перенаправления вывода. (Вы когда-нибудь видели вывод top(1) для своих терминалов, когда запускаете команду, которая генерирует много выводов для терминалов?)

Конечно, такой инструмент, как screen(1) (или dtach(1)?) также может позволить вам запустить скрипт без отправки его вывода через терминальную сессию, поэтому, возможно, потребуется четвертый вариант. Но, вероятно, есть и другие способы запуска сценария без принудительной отправки его вывода по сети ...

0

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

В любом случае, если вам все еще нужно увидеть результат, попробуйте добавить эти параметры для ssh:

ssh -c blowfish -C remotehost foo

Где -C включит сжатие, а -c blowfish выберет алгоритм шифрования, который оказывает меньшее влияние на процессор

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .