Во многих мануалах написано, что чтобы запустить команду в фоне, нужно в конце нее поставить амперсанд &. Однако у этого метода есть тонкости, которые мало где описаны.
Например, стоит задача периодически писать в файл какую-то информацию. Для примера, можно использовать вывод утилиты 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, переключившись на древовидное представление.