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] <mailto:[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] 
>>> <mailto:[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] <mailto:[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] 
>>>>> <mailto:[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] 
>>>>>> <mailto:[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] 
>>>>>> <mailto:[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
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to