Я использую '& ': почему процесс не работает в фоновом режиме?

Если Вы - двойная загрузка, она "просто не работает из Windows": это было бы виртуализацией.

Вы могли установить Монетный двор на внешнем жестком диске и затем поместить его в Вашей машине, но Вам, возможно, придется отредактировать /etc/fstab (например, внешний жесткий диск обнаруживается как sdb и при помещении его как основного жесткого диска это становится sda). Но даже затем, который маловероятен: Я полагаю, что Монетный двор использует UUID для разделов.

Кроме того, Вы могли поместить SSD в свою машину (перемещающий жесткий диск в корпус) и непосредственно установить Монетный двор там.

24
07.06.2014, 02:30
5 ответов

Когда вы закрываете терминальное окно, терминальный эмулятор посылает сигнал SIGHUP запущенному процессу, вашей оболочке. Затем ваша оболочка передает SIGHUP всему запущенному процессу. На вашей локальной системе это ssh. Затем ssh направляет SIGHUP к запущенному процессу, удаленному командному интерпретатору. Таким образом, ваша удаленная оболочка отправляет SIGHUP во все свои процессы, вашу фоновую программу.

Есть два способа обойти это.

  1. Диссоциировать фоновую программу из вашей оболочки.
    1. Используйте команду disown после фонового завершения процесса. Это заставит оболочку забыть об этом.
    2. Префиксация команды с помощью nohup (nohup $python program.py &). При этом достигается то же самое, но с помощью промежуточного процесса. В основном он игнорирует сигнал SIGHUP, а затем forks & выполняет вашу программу, которая наследует установку, а затем выходит. Поскольку она вилка, запускаемая программа не является дочерней частью оболочки, и оболочка об этом не знает. И если она не установит обработчик сигнала для SIGHUP, она все равно будет игнорировать это действие.
  2. Используйте logout вместо закрытия окна терминала. Когда вы используете logout, это не SIGHUP, и поэтому оболочка не будет посылать сигнал SIGHUP ни одному из своих дочерних устройств.

Кроме того, вы должны убедиться, что ваша программа не пишет на терминал через STDOUT или STDERR, так как оба этих способа больше не будут существовать после выхода терминала. Если Вы не перенаправите их на что-то вроде /dev/null, программа все равно будет выполняться, но если она попытается написать им, то получит SIGPIPE, а по умолчанию действие SIGPIPE заключается в том, чтобы убить процесс).

51
27.01.2020, 19:40

Оператор & разделяет команды для параллельного выполнения, так же как и ; разделяет команды для последовательного выполнения. Оба типа команд все равно будут выполняться как дочерние процессы оболочки .

Таким образом, когда вы закроете оболочку, которая запускала эти дочерние процессы, дочерние процессы также будут закрыты.

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

3
27.01.2020, 19:40

Когда вы выходите из системы, фоновые процессы, связанные с сеансом входа, обычно также убиваются. Если Вы хотите, чтобы они были отключены от сессии, запустите их с помощью nohup.

nohup python program.py &
1
27.01.2020, 19:40

В терминале процесс выполняется в фоновом режиме, но выход из stdoutstderr) все еще посылается на терминал. Чтобы остановить это, добавьте > /dev/null 2>&1 перед & для перенаправления обоих выходов на /dev/null - добавление disown также гарантирует, что процесс не будет завершен после закрытия клеммы:

COMMAND > /dev/null 2>&1 & disown

В вашем случае это будет:

python program.py > /dev/null 2>&1 & disown
14
27.01.2020, 19:40

После команды, заканчивающейся амперсандом (&), в командной строке выполните команду bg:

bash> python program.py &  
bash> bg  

Это переведет команду "&" на задний план

bash> jobs  

Это выведет список заданий, выполняющихся в фоновом режиме

bash> fg 1   

Это выведет задание №1 на передний план

Другой способ, (чтобы иметь возможность выйти из системы)

bash> at now  
bash> /full/path/python /full/path/program.py  
bash> ^d   `(# That is, Control-D, to run the command, Control-C to cancel)`  

Несколько строк можно подать командой at, перед ^d (Control-D)
. man at.

1
27.01.2020, 19:40

Теги

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