2017-01-20 5 views
2

Мой Scala скрипт создает подпроцессы так:Scala: Как предотвратить подпроцессы получать CTRL + C/Ctrl + C/SIGINT

val exitValue = Process(Seq("bash", "-c", command), dir) ! processLogger 

с командой быть, например, "mvn clean package" или для тестирования этого номера "sleep 20".

По какой-то причине мой скрипт должен перехватывать SIGINT, потому что пользователь мог означать «копировать» вместо «остановить его» (на самом деле это происходит время от времени). Я достиг этого путем добавления обработчика сигнала, как это:

Signal.handle(new Signal("INT"), this) 

override def handle(sig: Signal) 
{ 
    log.warn("Ignoring SIGINT (Ctrl+C). Press [Esc] instead.") 
} 

Однако когда подпроцесс работает это не работает, потому что CTRL + C делает его остановить. Что я могу сделать, чтобы подпроцесс игнорировал SIGINT? Я нашел решение для Python: Python: How to prevent subprocesses from receiving CTRL-C/Control-C/SIGINT Есть ли что-то подобное для Scala?

ответ

1

С момента запуска bash вы можете использовать встроенную команду trap, чтобы игнорировать сигналы в подпроцессе.

Просто предварять trap '' SIGINT; (точка с запятой) в command:

Process(Seq("bash", "-c", "trap '' SIGINT;" + command)) 
+0

Спасибо большое! Я даже думал о вызове 'python' для достижения этого – mbee