4

Скажем, у меня есть процесс, например, VIM с Ctrl-Z. Затем я запускаю xterm с помощью следующей команды xterm &> /dev/null & . Если я просто наберу "Отказаться", я потеряю процесс vim. Вместо этого мне нужно ввести PID процесса xterm, чтобы отречься от него.

Есть ли способ обойти это или есть причина, по которой это происходит?

1 ответ1

4

Как исправить (короткая версия)

У вас есть несколько способов сделать это:

  • С %- вы попросите отказаться от последней фоновой работы.

    xterm &> /dev/null & disown %-
    
  • С $! вместо этого вы попросите отказаться от последнего выполненного задания (через его PID).

    xterm &> /dev/null & disown $!
    

Так что потребуется написать еще пару символов, но, по крайней мере, вы можете выбрать, какие из них :-)

Причины

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

Еще несколько слов и пример

Вы можете проверить сказанное выше с помощью команды jobs , сравнив ее результаты до и после запуска задания в фоновом режиме.

  • Раньше: предположим, у вас есть несколько фоновых процессов, запущенных только из терминала (например, запущенных с помощью dolphin & и kate &).
    Теперь вы запускаете vim и приостанавливаете его с помощью Ctrl-Z.
    Выход jobs будет:

    [1]   Running                 dolphin . &
    [2]-  Running                 kate  &
    [3]+  Stopped                 vim
    

    vim - текущее задание, помеченное +, а kate - предыдущее, помеченное - .

    Действительно, в справочном руководстве bash глава 7.1 [ 1 ] объясняет, что
    «В выводе, относящемся к заданию (например, выводе команды заданий), текущее задание всегда помечается знаком« + », а предыдущее задание -« - ».»

  • После: Наконец, вы пишете команду xterm &> /dev/null & (без disown).

    Отвечая на jobs , на этот раз он ответит:

    [1]   Running                 dolphin .
    [2]   Running                 kate 
    [3]+  Stopped                 vim
    [4]-  Running                 xterm &> /dev/null &
    

    Обратите внимание, что vim по-прежнему помечен + а xterm - - .
    Последняя фоновая работа, помеченная знаком - это xterm а не больше kate & .

  • Другими словами, система действует так, как будто

    • Сначала он запускает xterm: новая команда (xterm) становится текущей и vim предыдущей.
    • Затем xterm отправляется в фоновом режиме, и элемент управления возвращается к предыдущему в списке (vim с его статусом), который снова становится текущим и снова помечается знаком + . Вместо этого xterm - это новое предыдущее задание, и оно помечено знаком - .
    • В конце вы найдете обновленную только предыдущую работу (-), а не текущую (+).

Так как вы можете позвонить в « disown » с указанием номера работы или PID, у вас есть два варианта

  • %-: на предыдущее задание можно ссылаться с помощью %-, возможно, его будет легче запомнить, если вы считаете, что также в заданиях помечено знаком -

  • $!: PID последнего задания, которое выполняется в фоновом режиме, находится в специальном параметре $! [ 2 ].

Команда disown примет оба.

Рекомендации

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