MyTetra Share
Делитесь знаниями!
Linux: Как запустить команду в фоне чтобы она не была остановлена (заморожена)
Время создания: 08.08.2014 17:09
Текстовые метки: linux, программа, команда, фон, фоновый процесс, остановка, заморозка, запуск, оторвать, текущий, процесс, шелл, shell, консоль
Раздел: Компьютер - Linux - Bash - Команды и скрипты
Запись: xintrea/mytetra_syncro/master/base/1407503380lijnek6eye/text.html на raw.github.com

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


Например, стоит задача периодически писать в файл какую-то информацию. Для примера, можно использовать вывод утилиты date. Чтобы происходил периодический вызов, можно воспользоваться утилитой watch.


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



watch date >> /tmp/date.txt



При запуске файл /tmp/date.txt начнет заполняться строками с ASCII-кодами, соответствующими "экранам" утилиты watch.


Запуск в фоне, в соответствии с рекомендациями, должен выглядеть так:



watch date >> /tmp/date.txt &



Но проблема в том, что при таком способе запуска программа в фоне заморозится и не будет работать, пока ее не вызовут в foreground командой fg. Это происходит из-за того, что родителем запускаемого процесса будет bash-шелл, и если программа будет продолжать работать, стандартный ввод/вывод данной программы будет путаться с вводом/выводом шелла.


Правильный запуск команды без остановки в фоне выглядит так:



(watch date >> /tmp/date.txt &)



При таком запуске, с использованием круглых скобок, родителем программы будет непосредстванно самый первый процесс - init. И поэтому остановки запущенной команды не произойдет, она нормально продолжится работать в фоне.


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


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования