Как выполнить новую фоновую команду последовательно, если у меня уже есть nohup фоновое выполнение команды?

Вы могли использовать расширение команды:

vi "$(locate filename123 | head -n1)"

Сделать vim считайте его stdin, который можно сделать vim -, но это просто даст Вам вывод locate которые являются путями имени файла. Это могло бы работать хотя, с помощью vim gf нормальная команда затем откроет путь, что курсор идет.

Править

В случае имен файлов с пробелами в них Вы лучше из использования xargs опция упоминается или vim решение, описанное выше. Отметьте для создания gf работайте необходимо добавить пространство к isfname:

set isfname+=32

Эта подсказка и альтернативы описаны здесь.

Редактирование 2

Добавленные кавычки и head как предложено PeterO в комментариях.

2
16.11.2013, 15:58
4 ответа

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

Первое, и не гарантируемое последовательным, должно отправить работу пакетной очереди, использующей пакетную команду. Это очень просто.

Иначе должен записать сценарий, который позволит Вам отправлять команды в него способ, которым делает пакет.

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

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

Скажите мне больше, и я могу помочь Вам больше. Коста

1
27.01.2020, 22:14
  • 1
    ! Ну, я делаю интерактивное пакетное задание PBS на HPC. Использовать qsub -I Я могу непосредственно войти в систему один из узла. Затем я могу выполнить команду на том узле. Я использую mathematica программное обеспечение и использование nohup math -run "<<file.m" &запускать программу. Так как я могу взаимодействовать с узлом, таким образом, я не отправлю все команды в единственное время с помощью файла сценария. Я могу выполнить команду в любое время, если я желаю. Таким образом, здесь прибывает проблема, я хочу свою фоновую программу, выполненную один за другим. Поскольку каждый прогон программы в параллельном режиме. Я не хочу их борющийся за ЦП и Память. Я не знаю, ясно выразился ли я? спасибо –  user15964 16.11.2013, 18:00

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

wait: wait [id]
Wait for job completion and return exit status.

Waits for the process identified by ID, which may be a process ID or a
job specification, and reports its termination status.  If ID is not
given, waits for all currently active child processes, and the return
status is zero.  If ID is a a job specification, waits for all processes
in the job's pipeline.

Так:

sleep 60 &
wait %%; echo nextjobs; sleep 60 &

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

1
27.01.2020, 22:14

Если Ваш Unix реализует fuser команда, это было бы самым легким путем:

while [ "$(fuser nohup.out 2>/dev/null)" ]; do sleep 2; done
command2

Удостоверьтесь, что Вы выполняете его в том же каталоге как command1.

Немного объяснения:

Когда Вы выполняете команду с nohup, файл называют nohup.out создается для хранения обоих из стандартного вывода команды и ошибки.

Команда, которую я предложил, контролирует это nohup.out файл, чтобы видеть, открыто ли это все еще. Если это так, это означает первый процесс, command1, все еще работает. В этом случае, while цикл ожидает в течение двух секунд, и попробовать еще раз. Когда command1 концы, nohup.out файл больше не используется, и цикл оставляют, позволяя command2 быть выполненным. Обратите внимание, что это не будет работать, если другой процесс, окажется, будет использовать nohup.out впоследствии, как кто-то выполнение tail -f nohup.out.


Править: Если Вы ОС не обеспечиваете fuser, вот портативный путь:

1: определите идентификатор процесса фонового процесса. Если Вы просто работали nohup команда, можно просто получить его с этой командой, если введено сразу после nohup:

pid=$!

Иначе используйте один из:

pgrep command1
ps -eo pid,comm| grep -w [c]ommand1
top

или безотносительно похожего метода и набора pid переменная соответственно.

Однажды Вы Вы сделаны, выполните эту команду:

while kill -0 $pid; do sleep 2; done
command2 

Это будет ожидать command1 завершаться перед запуском command2.

0
27.01.2020, 22:14
  • 1
    jlliagre! Но я - новичок Linux. Вы могли объяснить свой код немного? Спасибо CDR –  user15964 16.11.2013, 17:47
  • 2
    добавляется. –  jlliagre 16.11.2013, 18:32
  • 3
    ! Я понимаю Ваш метод. Кажется, что это не таким образом устойчиво. Это полагается на состояние nohup.out. В моем случае я всегда перенаправляю nohup.out к каталогу, который я запускаю программу, затем этот метод не будет собирающийся работать. Но у меня есть идея. Так как каждый nohup может быть прослежен в команде jobs, так можем мы просто контроль jobs очередь? Это - то, если все предыдущее задание сделано, то выполненная новая команда. Я не знаю, выполнимо ли или нет, и как достигнуть его. –  user15964 17.11.2013, 03:56
  • 4
    и кроме того, я просто нашел fuser команда не найдена на моем HPC –  user15964 17.11.2013, 04:44
  • 5
    Вы не упоминали перенаправление nohup некоторым не файл, по умолчанию, но этот метод может, конечно, быть адаптирован для контроля другого файла. Поскольку Ваша система не обеспечивает fuser, Я обновляю свой ответ с решением, которое должно работать с любым Unix как ОС. –  jlliagre 17.11.2013, 11:22

сделать оболочку sub?

nohup (commancd1;command2) &
0
27.01.2020, 22:14
  • 1
    1. Это не допустимый синтаксис оболочки. nohup sh -c 'command1; command2' & работал бы. 2. Это не помогает здесь: command1 уже запустился. –  Gilles 'SO- stop being evil' 17.11.2013, 22:06

Теги

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