Выполните команду, не заставляя меня ожидать

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

Если Вы будете наделены большим количеством RAM, то ограничивающим фактором в долгой компиляции будет процессорное время. Затем одной задачей на ЦП, плюс одна незаконченная задача для тех случайных блоков ввода-вывода, является хорошая установка. Это делает его -j3 для двухъядерного ЦП (или более точно, для машины двойного ЦП — если бы каждое ядро является гиперпоточным, который был бы 4 центральными процессорами, таким образом, -j5).

Если у Вас есть очень мало RAM, то ограничивающий фактор может быть то, что у Вас не может быть многих параллельных заданий, или иначе они будут продолжать делать друг друга выгрузить. Например, если Вы не можете удобно приспособить два экземпляра компилятора в памяти, make -j2 может уже быть медленнее, чем make. Так как это зависит от того, сколько процессов компилятора можно поместиться в RAM сразу, нет никакого способа получить общее число.

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

147
04.11.2015, 18:50
9 ответов

Прежде, чем выполнить команду, можно добавить & к командной строке для выполнения в фоновом режиме:

long-running-command &

После запуска команды можно нажать CtrlZ для приостановки его, и затем bg помещать его в фоновом режиме:

long-running-command
[Ctrl+Z]
bg
157
27.01.2020, 19:28
  • 1
    , который я использовал, "находит ~ / a.java и" команда, но я не сделал вошел в фон? Кроме того, я попробовал cmd+z (для Mac).... он не работает –  Abhimanyu Aryan 05.08.2015, 13:08
  • 2
    @AbhimanyuAryan, возможно, Вы хотите отладить Ваш find ... управляйте сначала, затем выполните его в фоновом режиме. В этом случае Вы отсутствовали -name опция. –  Alexis Wilke 18.08.2016, 08:19

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

nohup command &

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

Существует другой названный disown но это - скорее расширение других ответов скорее что метод сам по себе:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

Эти команды не делают позволяет Вам восстанавливать легко выводы процесса, если Вы не используете hackish способ сделать его.

118
27.01.2020, 19:28
  • 1
    с тех пор '95. Никогда не слышал о, отрицают до сих пор, Спасибо! Это не работает с каждой оболочкой хотя (проверенный удар, zsh, tcsh. tcsh не работал). –  yoonix 05.12.2013, 04:36
  • 2
    Используя nohup в управлении заданиями оболочка глупа. Современные оболочки не отправляют HUP к фоновым процессам. Перенаправление к уникальному имени файла является маленькой ценой для оплаты. уверенный –  chicks 04.11.2015, 18:47
  • 3
    @chicks вариант использования здесь состоит в том, чтобы предотвратить stderr и stdout для загрязнения терминала, плюс который он создает файл журнала автоматически. –  Braiam 04.11.2015, 18:50
  • 4
    command > file.log 2>&1 & disown немного длиннее, чем nohup command & но я предполагаю, что это - то, что предлагал @chicks. –  joeytwiddle 01.09.2016, 10:33

(Для полноты - уже ответил:) Вы помещаете команду в фоновом режиме путем добавления & после команды:

long_command with arguments > redirection &

Я добавляю этот ответ для обращения к другой части вопроса:

Нет никакого реального эквивалента счетчика для показа происходящих фоновых команд, но Вы видите состояние фоновых команд путем ввода jobs или jobs -l. Это покажет Вам Ваши фоновые команды, и работают ли они, остановленный через сигнал (например, с ^Z), или иногда останавливался, потому что они ожидают интерактивного входа от Вас.

5
27.01.2020, 19:28
  • 1
    long_command with arguments &> redirection & перенаправить stderr также –  Ice-Blaze 11.01.2017, 09:24

Можно запустить программу в фоновом режиме с помощью &. Например, если Вы хотели работать yum install XyZ например, Вы могли работать:

yum install XyZ &

stdout или произведенный из программы может быть перенаправлен с помощью > перезаписывать файл, или >> добавлять в файл. Например, если Вы хотели зарегистрироваться yum в файле yum.log:

yum install XyZ > yum.log &

Или, если Вы хотели добавить вывод к существующему файлу log:

yum install XyZ >> log &

Ошибки печатаются к stderr и нет stdout, и может быть перенаправлен в файл таким же образом, но использование 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

Если Вы хотели перенаправить обоих stderr и stdout, можно использовать &>:

yum install XyZ &> output
yum install XyZ &>> output
3
27.01.2020, 19:28

Изучите экран или tmux. Пример с tmux:

$ tmux new -d 'longrunningcommand'

В то время как другие ответы с помощью '&' к фону будут работать, необходимо перенаправить stdout (и stderr!). Не делая этого, вывод перейдет прямо к Вашей оболочке, смешиваясь с тем, что другой вывод Вы можете иметь.

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

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

Экран является старой испытанной и истинной программой; tmux намного моложе, но извлек уроки из прошлого экрана.

9
27.01.2020, 19:28
  • 1
    Этот ответ пропускает фактический ответ и походит прочитайте руководство. –  Lloeki 20.06.2017, 15:54

Можно выполнить команду в фоновом режиме просто путем помещения & знак после него.

Например:

areallylong_command &

выполнит его в фоновом режиме.

Можно далее перенаправить stdout/stderr в соответствующие файлы так, чтобы они не появлялись на терминале, в то время как Вы делаете что-то.

Посмотрите это для большего количества информации: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

2
27.01.2020, 19:28

Это, вероятно, то, что вам нужно

my_command> output.log 2> & 1 &

это запустит вашу команду, перенаправляя как stdout, так и stderr в некоторый output.log , который вы можете указать. Если вам вообще не нужно сохранять вывод - вы можете использовать / dev / null вместо фактического файла.

& выполнит команду в фоновом режиме, чтобы вы могли продолжать вводить команды во время ее выполнения. 2> & 1 перенаправляет stderr на stdout, чтобы перехватить весь вывод.

также, когда вы запускаете такую ​​команду, вы должны получить подтверждение от ядра, подобное этому: [2] 1234 Это означает, что ваш процесс выполняется в фон и его идентификатор - 1234 , поэтому вы можете убить его позже, если хотите, с помощью kill -9 1234

35
27.01.2020, 19:28

Попробуйте использовать команду «экран» перед запуском длительной задачи, а затем, когда вы отсоединитесь, вы сможете снова подключиться к «экрану -r -d», когда вам снова понадобится. Я обнаружил, что при использовании терминала через ssh или другие сетевые подключения они иногда могут прерываться из-за плохого подключения к серверу. запуск его внутри «экрана» устраняет эту проблему.

0
20.08.2021, 13:01

Вы также можете перевести скрипт/программу в фоновый режим, когда поймете, что она будет работать какое-то время ПОСЛЕ того, как вы ее запустили.

Введите "cntl -z". Что остановит программу.

затем введите «bg» для фона, что возобновит работу программы в фоновом режиме.

Этот метод также сработает, если вы запустили программу, использующую графический интерфейс, но вам необходимо вводить другие команды через интерфейс командной строки. Cntl -z и "bg" позволят вам снова использовать подсказку окна терминала.

Если вам нужно перевести программу из фона на передний план, используйте команду «jobs», чтобы получить номер фонового задания, затем введите «fg». Если у вас есть только одно задание в фоновом режиме, сработает простое «fg».

Попрактикуйтесь в использовании vim. cntl -z отлично работает, как и "fg". Обычно я запускаю несколько правок vim одновременно. Переход между правками функций.

0
20.08.2021, 13:01

Теги

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