The Ctrl+C default behavior in Karaf is to to call Thread.interrupt(). The effect depends on what the thread is doing, you'll find more information at [1]. If you want the command to be interrupted, the code needs to support it correctly.
[1] https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html Cheers, Guillaume Nodet Le sam. 14 mars 2020 à 20:45, Mike Hummel <[email protected]> a écrit : > The problem is if I not listen to ctrl-c in the moment of the interrupt > > while(true) { > 1) do something > 2) Thread.sleep() > } > > And the 'Interrupt' is while (1) and not in (2) then the cmd will not be > interrupted. - I tested it. > > (The interrupt will be thrown in Thread.sleep() and (I think) in > Object.wait(), but not in 'normal' executon or if try {} (catch Throwable) > is used) > > It will not break the command loop but will move the command in background > (correct: status == Done) and the cmd will not stop working. > > something like this would be nice > > while(true) { > 1) something > 2) Thread.sleep() > 3) if (is canceled) break; > } > > But (in 3) for the command it's not possible to check the status of > execution. It's in org.apache.felix.gogo.runtime.CommandSessionImpl > > So using crtl-c to cancel the command execution is like roulette. > > > > On 14. Mar 2020, at 20:28, Jean-Baptiste Onofre <[email protected]> wrote: > > CTRL-C just works fine in Karaf commands (including the one creating > thread like log:tail). > > So, your use case is about intercepting CTRL-C yourself, right ? What’s > the use case you want to achieve ? > > Regards > JB > > Le 14 mars 2020 à 18:26, Mike Hummel <[email protected]> a écrit : > > Looks like it's not possible to block the ctrl-c event. It's implemented > in felix gogo shell ans since every cmd (in a pipe) is executed in a > separate thread it's not clear witch one should do the interruption control > > Maybe the feature "IGNORE_INTERRUPS" should not be offered. > > But felix should inform the commands if the execution is canceled. For > example by checking for the Closeable interface and calling the close() > method. > > > On 14. Mar 2020, at 11:09, Jean-Baptiste Onofre <[email protected]> wrote: > > Hi Mike, > > Let me take a look. > > Thanks for the report. > > Regards > JB > > Le 14 mars 2020 à 09:03, Mike Hummel <[email protected]> a écrit : > > Hello, > > I did a little bit research for IGNORE_INTERRUPTS in the karaf sources. I > found in master and karaf-4.2.x the same results. > > The const is defined in 'Sessio'n and 'SessionProperties', but only used > from 'Session'. > > It is only used to enable the behaviour but never used to implement some > kind of behaviour. > > Is there someone how can can prove this? And what is the background for > two definitions of the same const? If I have the background I could look > for a fix. > > Just now I created KARAF-6645 to track the problem. > > Best Regards, > > Mike > > > > > On 5. Mar 2020, at 09:53, Mike Hummel <[email protected]> wrote: > > It's not easy to say ... In 4.2.3 it's broken and in 4.1.x it was ok. > > I testet the flag IGNORE_INTERRUPTS in 4.2.7 and it was not working as I > imagine. I'm even not sure if the flag is exact what I want to do. > > > On 4. Mar 2020, at 09:18, Guillaume Nodet <[email protected]> wrote: > > Could you be more specific about "older releases" ? Do you know in which > release it broke ? > > Le mer. 4 mars 2020 à 09:14, Mike Hummel <[email protected]> a écrit : > >> Hello, >> >> I try to break my karaf commands with Ctrl-C (e.g. by using >> Thread.sleep()). In older releases this was no problem, but since the shell >> starts every command in a separate thread the Cltr-C is also caught by gogo >> and it will unlock the command from the console. >> >> I also tried this >> >> session.put(Session.IGNORE_INTERRUPTS, Boolean.TRUE); >> >> but it gets not the effect. >> >> Is there a way to recognise if the current command is separated from the >> current gogo command line? >> >> A sample snipped: >> >> Object oldIgnoreInterrupts = >> session.get(Session.IGNORE_INTERRUPTS); >> try { >> session.put(Session.IGNORE_INTERRUPTS, Boolean.TRUE); >> return doExecute(this, cmd, parameters); >> } finally { >> session.put(Session.IGNORE_INTERRUPTS, oldIgnoreInterrupts); >> } >> >> public Object doExecute(CmdShitYo base, String cmd, String[] >> parameters) throws Exception { >> if (cmd.equals("ctrl-c")) { >> try { >> while (true) { >> System.out.println("Wait for Ctrl-C - off"); >> MThread.sleep(3000); >> } >> } catch (InterruptedException e) { >> System.out.println("Interrupted !!!!"); >> } >> } >> } >> >> MThread: >> public static void sleep(long _millisec) { >> try { >> Thread.sleep(_millisec); >> } catch (InterruptedException e) { >> log.i(e); >> } >> } >> >> This will output >> >> Wait for Ctrl-C - off >> Wait for Ctrl-C - on >> Wait for Ctrl-C - off >> Wait for Ctrl-C - on >> ... >> >> If I interrupt, it will be separated from gogo shell and iterate for >> ever. - And I see the interrupted exception in the log. >> >> Thx, >> >> Mike > > > > -- > ------------------------ > Guillaume Nodet > > > > > > > > -- ------------------------ Guillaume Nodet
