Я создал приложение Java, которое может запускать процессы и захватывать их PID, чтобы приложение могло контролировать процесс. Позже пользователь может решить уничтожить все дерево процессов (сеанс). Я сделал это с помощью setsid. Один сценарий запускает целую кучу разных процессов с помощью сценария оболочки: setsid <shell script>
. PID представляет новый сеанс, и его уничтожение уничтожит все процессы, созданные в этом сеансе. Он прекрасно работал до выхода Ubuntu 12.10. Теперь я не могу убить все сессии, запущенные с помощью setsid. Одним из примеров является Firefox и Google Earth. Гедит все еще может быть убит, если его запустить через сетсид.
Я создал простую тестовую программу, которая выполняет kill -SIGTERM -PID
. Тестовой программе удается уничтожить firefox, запущенный через setsid в Ubuntu 12.04, но не в Ubuntu 12.10. Я не знаю, что изменилось. Я выполнил программу в обоих дистрибутивах, используя OpenJDK 6, 7 и Oracle JDK 6.
public class kill
{
public static void main(String[] args)
{
try
{
System.out.println("kill -SIGTERM -" + args[0]);
Process proc = Runtime.getRuntime().exec("kill -SIGTERM -" + args[0]);
int exitVal = proc.waitFor();
System.out.println("Exit value: " + exitVal); // often 1 under Ubuntu 12.10
}
catch (Exception e)
{
}
}
В Ubunutu 12.04 и Centos 5 + 6 можно использовать имя сигнала, например, SIGTERM, но 12.10 вместо него следует использовать -TERM. Изменение моего кода таким образом, чтобы имена сигналов не имели префикса «SIG», по-видимому, хорошо работало на 12.04 и 12.10. Итак, пример кода, который работает для меня:
Process proc = Runtime.getRuntime().exec("kill -TERM -" + args[0]);
Чтобы уточнить, kill -SIGTERM -<PID>
работает в оболочке Bash в Ubuntu 12.10, но не в том случае, если она выполняется через Runtime.getRuntime.exec()
, нужно удалить ' SIG 'часть, как описано выше.