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

Некоторые программы возвращаются сразу после запуска из командной строки, например, Firefox. Большинство утилит (и все программы, которые я написал) привязаны к оболочке, которая их создала. Если вы управляете командной строкой -c, программа мертва.

Что вам нужно добавить в программу или сценарий оболочки, чтобы получить поведение с немедленным возвратом? Думаю, я задаю там два вопроса: один для сценариев оболочки и один для общего, если они разные. Мне было бы особенно интересно узнать, есть ли способ заставить исполняемый файл jar сделать это.

Мне почти стыдно спрашивать об этом, но я не могу найти ответ сам.

Спасибо!


person Yuvi Masory    schedule 26.01.2010    source источник
comment
Дублирование: stackoverflow. com/questions/116701/ (из stackoverflow.com/search?q=unix+background) и, возможно, также stackoverflow.com/questions/881388/ (из stackoverflow.com/search?q=daemon+fork+exec+unix, который, похоже, уже требует знания части ответа).   -  person dmckee --- ex-moderator kitten    schedule 26.01.2010
comment
Хороший кандидат на то, чтобы не удалять BTW. Этот заголовок является естественным выражением, которое будет искать иначе, чем другие...   -  person dmckee --- ex-moderator kitten    schedule 26.01.2010
comment
для Windows (поскольку Google привел меня сюда) betterlogic.com/roger/2014/01/   -  person rogerdpack    schedule 22.01.2014


Ответы (4)


Для исполняемой программы (в отличие от сценария оболочки) в Linux/Unix используйте fork() и exec(), а затем выйдите из родительского процесса, который вернется в оболочку. Подробнее см. справочные страницы или какую-либо страницу, например http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html.

person GaryO    schedule 26.01.2010
comment
Спасибо! И Деннис тоже. Похоже, что nohup и fork/exec — это ответы, которые я искал. - person Yuvi Masory; 26.01.2010
comment
см. также вызов daemon(), который сделает его настоящим фоновым процессом (отсоединитесь от tty и создайте новый сеанс) - person nos; 27.01.2010

start cmd 

в Windows,

cmd &

на *нукс

Здесь замените

cmd = java -jar JarFile.jar

В *nux команды fg и bg тоже ваши друзья...

person Hamish Grubijan    schedule 26.01.2010
comment
Спасибо за информацию. Разве & просто не переводит процесс в фоновый режим? Когда я закрываю эмулятор терминала, процесс все равно умирает. - person Yuvi Masory; 26.01.2010
comment
Как сказал Деннис, nohup — ваш друг. Затем убейте с помощью pid, используя top и т. д. - person Hamish Grubijan; 26.01.2010

Вам нужно в основном разветвить процесс или создать новый поток (или притвориться)

в * nux вы можете сделать это с помощью & после такой команды /long/script & или в Windows вы можете создать BATCH-файл, который выполняет ваши процессы, а затем завершает работу (это происходит естественным образом).

ПРИМЕЧАНИЕ. Нет особенно хорошего способа сослаться на этот процесс после его разветвления, в основном только ps для списка процессов. если вы хотите увидеть, что делает процесс, проверьте, используя screen (другая команда linux), которая запустит сеанс для вас и позволит вам «повторно подключиться» к экрану.

для этого установите экран (sudo apt-get install screen или yum install screen). затем введите screen, чтобы создать новый сеанс (обратите внимание, это будет выглядеть так, как будто вы ничего не делали). затем запустите /long/command (без &), затем нажмите CTRL + A + D (одновременно), чтобы отсоединиться от него (он все еще работает!). затем, когда вы хотите повторно подключиться, введите screen -r.

Кроме того, ищите флаги в любом справочном сообщении, которые позволяют вам сделать это без использования вышеуказанных параметров (например, в synergy вы можете сказать synergy --background)

person Dan Beam    schedule 26.01.2010

Сценарий-оболочка, состоящий только из:

your_prog_or_script &

Запустит цель и немедленно выйдет. Вы можете добавить nohup в начало этой строки, чтобы она продолжала работать при выходе из оболочки.

person Dennis Williamson    schedule 26.01.2010