Я правда не знаю, в чем преимущества работы приложений в фоновом режиме.
Что-то типа Application &
командной строки.
Почему именно мы запускаем приложения в фоновом режиме и когда следует принимать решение об этом?
решение1
Обычно приложения, выполнение которых занимает слишком много времени и не требует взаимодействия с пользователем, отправляются в фоновый режим, чтобы мы могли продолжить работу в терминале.
Задания, работающие в фоновом режиме, обрабатываются так же, как и задания, работающие в активном режиме, за исключением того, что их STDOUT, STDIN и STDERR различаются.
Если у вас есть задания, которые занимают слишком много времени, например сжатие файлов или резервное копирование, вы можете отправить их в фоновый режим.
Вы можете вывести список заданий, работающих в фоновом режиме, с помощью jobs
команды.
$ ./job1.sh &
[1] 9747
$ ./job2.sh &
[2] 9749
$ ./job3.sh &
[3] 9751
$ jobs
[1] Running ./job1.sh &
[2]- Running ./job2.sh &
[3]+ Running ./job3.sh &
Здесь всякий раз, когда задание отправляется в фоновый режим, оболочка отображает job id
и pid
процесса. В случае, если мы хотим, чтобы процесс вернулся на передний план, мы можем использовать fg
команду, чтобы вернуть его обратно.
$ fg 1
./job1.sh
Но имейте в виду, что когда вы закрываете терминал (оболочку), SIGHUP будет отправлен всем фоновым процессам, которые порождены оболочкой, что приведет к их завершению. Чтобы предотвратить это, вы можете использовать disown
команду для удаления этих процессов из таблицы заданий и, таким образом, предотвратить завершение процесса.
Один из лучших способов — запустить фоновый процесс с помощью nohup
команды, чтобы сигналы SIGHUP не завершали процесс и он безопасно работал в фоновом режиме.
Предотвратить отправку SIGHUP дочерним процессам (заданиям bg) можно также с помощью настройки huponexit
параметра оболочки bash.
$ shopt -s huponexit
Эта опция установлена по умолчанию в последних версиях Bash, но если она не установлена, мы можем добавить ее, ~/.bashrc
чтобы сделать поведением по умолчанию.
решение2
Если вы запускаете приложение, которому нужно, скажем, 5 минут для завершения, например, задание копирования, оболочка блокируется, пока программа работает, все 5 минут. Задание копирования тогда находится в так называемой группе процессов переднего плана, обозначенной знаком +
. ps
Вам может потребоваться выполнить какую-то другую работу в течение этих 5 минут, но оболочка блокируется.
С другой стороны, когда вы выполняете задание копирования в фоновом режиме ( cp source target &
), ваше задание выполняется в фоновом режиме, не блокируя текущую оболочку. Вы можете продолжить заниматься другими делами. Вы можете вернуть процесс на передний план, fg
если хотите.