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

Reply via email to