Как обеспечить безопасность процесса «демона» при запуске вручную?

475
jrhorn424

Однажды я использовал в emacsclientкачестве редактора из командной строки, но меня беспокоило, что он будет висеть в окне терминала, пока я работаю emacs.
Я попытался запустить процесс в фоновом режиме, emacsclient somefile.txt &но это привело к большому количеству «сломанных труб». Я не знал, что это было, но мои файлы были повреждены. Я научился справляться с проблемой.

Недавно я также начал использовать latexmkдля составления научных работ. Я попытался latexmk -pvc &запустить процесс непрерывной компиляции в фоновом режиме, но снова столкнулся с проблемой «сломанных труб».

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

Но я продолжаю работать удаленно на машинах без эмуляторов экрана. Есть ли запеченный способ многозадачности в одном терминальном окне?

0

1 ответ на вопрос

2
cecilkorik

Насколько я знаю, единственная причина, по которой вы получили бы сломанный канал с фоновым процессом, - это если вы закроете окно терминала, которое его запустило. Несмотря на то, что он находится в фоновом режиме, он все еще подключен к вашему терминалу по каналам к stdin и stdout. Если вы закроете, выйдете из системы или выйдете из терминала, каналы процесса прервутся, и процесс получит сигнал на завершение (думаю, SIGHUP).

Решение этого, вероятно, будет использовать nohup. nohup перенаправляет stdin, stdout и stderr нового фонового процесса в файлы и предотвращает отправку процесса SIGHUP.

Чтобы использовать его, вы можете запустить nohup emacsclient somefile.txt &или, если вы хотите избежать файлов nohup.out и nohup.err, которые он использует для захвата stdout и stderr, вы можете полностью избавиться от вывода nohup emacsclient somefile.txt &> /dev/null &.

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

Я не знал о `nohup`. В прошлом я также был озадачен фрагментами кода, использующими `/ dev / null`, но никогда не удосужился разобраться в этом. Спасибо, что научил меня чему-то. :) jrhorn424 13 лет назад 0
Рад, что смог помочь, удачи! Для пояснения, бит `&> / dev / null` присоединяет как stderr, так и stdout к файлу` / dev / null`. Это означает, что он в основном оставляет их отключенными, так как / dev / null - это специальное устройство, которое отбрасывает весь ввод. cecilkorik 13 лет назад 0

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