Запуск процесса, который ожидает ввода в фоновом режиме, без остановки и без отправки ввода - PullRequest
1 голос
/ 06 марта 2012

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

spawnThreadAndDoStuff();
System.in.read();
System.exit(0);

Я хочу запустить его в фоновом режиме из скрипта на неопределенный срок и просто перейтиубей, когда я хочу, чтобы это закончилось.Я думал, что чтение ввода из / dev / null сделает это, но, похоже, это не работает.Мой сценарий выглядит так:

#!/bin/bash
java -cp someapp > mylog.log < /dev/null &

Я делаю это неправильно, или мой подход только далек?Каков будет правильный способ справиться с этим?

Ответы [ 3 ]

4 голосов
/ 06 марта 2012

Чтение из /dev/null не работает, потому что read немедленно возвращается с концом файла.

Это работает для меня:

(while true; do sleep 10000; done) | java -cp someapp > mylog.log &

Первая команда просто спитнавсегда, никогда не предоставляя никакой информации.

1 голос
/ 06 марта 2012

Что вы делаете неправильно, так это то, что ввод из / dev / null ведет себя как 0-байтовый файл, и поэтому процесс достигает EOF при стандартном вводе и завершается. Если / dev / null может содержать процесс, ожидающий ввода, это будет работать:

$ cat < /dev/null

Но, конечно же, кот сразу же выходит.

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

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

Если вы хотите, чтобы оба поведения (фоновый режим и режим пользовательского выхода) были настроены во время выполнения программы. Одним из способов было бы просто определить, является ли стандартный ввод устройством TTY или нет. Если это устройство TTY, выполните чтение и выход TTY. Если это не TTY, не читайте: вместо этого сделайте бесконечный сон. Тогда ваш стандартный прием ввода / dev / null должен работать. / dev / null не является TTY, поэтому процесс будет просто спать.

(У вас есть функция isatty в Java?)

0 голосов
/ 06 марта 2012

команда ... & thePIDofCOMMAND = $!

.... делать вещи kill $ thePIDofCOMMAND

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...