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
>>>>>>
>>>>>
>>>>
>>>
>>
>