Hi Eduard,
I did something similar in past
only difference:

  • used #q1c1#  to make sure placeholders are embedded and don't conflict  with the real text
  • my table was in HTML with default row visibility HIDDEN
    only with actual content, it was set to VISIBLE.
    This allowed also to skip rows and have not only uniform rows
    and I could also play with styles.

Whatever OS you use you will need some driver-like code to control the state of the connection at HW level.

Next COS may listen on a TCP or UDP port or poll the driver on a regular base.
Dependent on the intelligence of the driver it may even start an appropriate sessiom from the command line. 
Or run a call-in to Caché over the published interface.

But it is always some code external to Cache´to handle the HW. 

Hi Ben,

from the hacker's toolbox:

Parameter MAXSTACK = 15;
Trigger TUpdateFoobar [ Event = INSERT/UPDATE, Foreach = row/object, Time = AFTER ]
{
  Try {
    // get value of Foobar
    NEW fb
    SET fb= {Foobar}
    IF $STACK > ..#MAXSTACK {
     // just for debugging
     wwrite "***",$STACK
         // INSERT value into embedded Primary Environments
         &sql(UPDATE ContainerObj (InnerObj_Foobar) 
              VALUES (:fb)
              WHERE %ID=:{ID})
    }
} Catch tError {
Do LOG^%ETN
Throw tError
}
}

You have to find out by "hacking"  a suitable value for MAXSTACK related to your application.
Inside the looping Trigger, there is no chance to identify the first run of the loop.

If you know a %variable (e.g. %BenMax) you may use it as well.
You only have to make sure it is initialized outside your trigger.  

IF $i(%BenMax) > ..#MAXSTACK {

With SQL you can initial %BenMax by a static (independent of row) WHERE Condition 

 INSERT ..... WHERE my.BENMAX()=1 and ....

The ClassMethod BENMAX may look like this:

ClassMethod BenMax(As %Integer = 1 ) As %Integer [ SqlName = BENMAX ]
{       set %BenMax=$s(n:n,1:1) quit 1    }

David,
I digged a little bit following your hint into Eclipse.

menu Windows / Prefernces (by user !) presented this image  


and this is the content of storage_location 

#Equinox secure storage version 1.0
#Fri May 25 19:54:27 CEST 2018
/com.intersystems.atelier.connmgr/ENS/port=\t,NTc3NzQ\=
/com.intersystems.atelier.connmgr/ENS/ssl=\t,ZmFsc2U\=
/com.intersystems.atelier.connmgr/2016-2/user=\t,cmNlbXBlcg\=\=
/com.intersystems.atelier.connmgr/2016-2/pass=org.eclipse.equinox.security.windowspasswordprovider64bit\tw+5qObI6N8Y\=,FVLqyPMCkoqq6Q7jjl0Wyw\=\=
/com.intersystems.atelier.connmgr/ENS/host=\t,bG9jYWxob3N0
/com.intersystems.atelier.connmgr/2016-2/ssl=\t,ZmFsc2U\=
/org.eclipse.equinox.secure.storage/verification/org.eclipse.equinox.security.windowspasswordprovider64bit=org.eclipse.equinox.security.windowspasswordprovider64bit\tvhjCbjyiXyI\=,kN4AlU0D0lskPVn+ZkduJBzTJLtNI69y
org.eclipse.equinox.security.preferences.keyFactory=PBEWithMD5AndDES
/com.intersystems.atelier.connmgr/2016-2/port=\t,NTc3NzI\=
/org.eclipse.equinox.secure.storage/windows64/encryptedPassword=\t,QVFBQUFOQ01uZDhCRmRFUmpIb0F3RS9DbCtzQkFBQUFITms3N0Z1ZTVVZTZuY1JuZUpLT0pnQUFBQUFRQUFBQVJRQnhBSFVBYVFCdUFHOEFlQUFBQUJCbUFBQUFBUUFBSUFBQUFMejUrdHB5MnVhUXVmWGIxNloyYm9kZGpNWFliNEFRdHBickJodnlwU0pPQUFBQUFBNkFBQUFBQWdBQUlBQUFBTHFOWmFFNUhnWTdBNytjRFhoQ1d5NVdIajJGcVJkVWNJTjVhS2l1NkVlQVlBRUFBSnRlODlWYWVkSFdLREh0OHY1aFhrc1NyL2RwaFVoWFV3V2RJNDdraXFhZk9RdVowK3ZVdUk4bzJFOUNwL2JtS2Q5YVc3WG9mN0YrQlBjOWhja0R1UXRWbzB3QkRuQkM4SW5MTWh1L2haVTNHRmhGODQxUEZSZHhOeDlVMmRjU0tFcXZtZEpVSXlQbjJZWWlEUWpMV2JnVEZ0Z1NlajVVV1RldUxPWEFUaXRSMDBqM1hTWjB0ZmlDK2ZlVE8rVEtIa3VkTnZXZGNBNS9UQ2gydDhOUEVWRHljd2F6WjVkK3IyOVdjS1BjVlNNaXFUTVZMR1FFdlB3M1ZPTUhhSVVUNTR4SEVOV3dncndJZ0J2S0JVU3NHVVVNSER2dE44MUJUNUEvVnc1TVR6VmMyNWkwUk4wandtRzUvSWJyaHhVSy81STFwanhaL0czRFJ1eGlZZWhpQkREM3JRTzdPSE5lVlRxdmk0bSt2cUxoQlUxYi9LcVNqSkNFMktLa2RGby9vaDRMeGJscHdhcHFOa09maURLZi8yVmpnTkd1UTRyVEJnVEIxSUpBRFA0TExZMWJyeUttV0dicE5adG1xRDBpVURCc3BQQ3FmOUh0L1BBSHV3a1lNUTFBQUFBQUkyS2RnYjVSajhXYmxSd0xXdGZZZndodmJ4eDFDR2tZYy9UNWI2eThLZFdrOUJSdTV6VzRneC9WTjVwemRTaVl0UjZnZVVBQmdHSkE0OVI3YXg5amxRPT0\=
/com.intersystems.atelier.connmgr/ENS/user=\t,cmNlbXBlcg\=\=
/org.eclipse.equinox.secure.storage/recovery/org.eclipse.equinox.security.windowspasswordprovider64bit/org.eclipse.equinox.security.internal.recovery.question2=\t,cHJlZmVycmVkIGJhbmQ\=
/org.eclipse.equinox.secure.storage/recovery/org.eclip
se.equinox.security.windowspasswordprovider64bit/org.eclipse.equinox.security.internal.recovery.question1=\t,bW90aGVyJ3MgbmFtZQ\=\=
/com.intersystems.atelier.connmgr/ENS/pass=org.eclipse.equinox.security.windowspasswordprovider64bit\tp9QyPCw3qvU\=,ZefLoWUenz48mT11jp1crA\=\=
org.eclipse.equinox.security.preferences.cipher=PBEWithMD5AndDES
/com.intersystems.atelier.connmgr/2016-2/host=\t,bG9jYWxob3N0
org.eclipse.equinox.security.preferences.version=1
/org.eclipse.equinox.secure.storage/recovery/org.eclipse.equinox.security.windowspasswordprovider64bit/org.eclipse.equinox.security.internal.recovery.password=org.eclipse.equinox.security.recoveryModule\tA0LP4JVoFdk\=,SzaccA06wSF+uh0AtcUhHwSgaGG6D2zZ1NOTJsm/ulkjaBmWAppasPrnkWJgOJb6C5insCpZcCyHKNPOOSKLXb1kuxkPDHo++9aEGbFxlbpmCO4p483ToK25KXgV0E+Gj5u4EPsHpsYvb4L4wAtyeESf0gZnbxKim3YqsFrim1SEuZKGoZH3QjYWxM0auPlFwnvgyK6RwfyznDbHvvWTtl4G3Hq4B1X3+cbqOdrkanDCjYFsQ2eutlddFe52AId+kqg1TplQL51PQFILIxHjg2LRmp2Qol321Oex7Oqk1iiddZmTeY/ToBTEzJCCdr1JbGIY5Pi3XJ3NRGyRF0rAsYC46+m6T3NmJsNid6I/V3t5BaOvFsxxfjfs9XXJ25RRWY6OiHbkp/dwsMaEMjy0zkEI3B4qvXOc7Gbf5wGyR9dXsqLEv2LzlDDY8Ne/kWU2v6J6S59EdU8\=
 

I doubt that without hijacking your (Windows ?) account this can NOT be misused.
 

Ruslan,

After execution, the JOB Command sets system variable $ZCHILD

$ZCHILD contains the ID of the last child process that the current process created with the JOB command. If your process has not used JOB to create a child process, $ZCHILD returns 0 (zero).

$ZCHILD being set does not mean that the job was successfully started. It only means that the process was created and the parameters were passed successfully.

Now you have the OIID in hands to apply to $System.Process.Terminate(bgjob) as suggested already by  Vitaliy Serdtsev

Alex,
add Parameter  

Parameter XMLTYPE = "A_CHILD";

to one of your child classes
inherited comment is somewhat vague:

/// This parameter provides the default XMLTYPE for the class. If it is
/// empty then the class name will be used to construct a default XML type.
/// 
/// The default XMLTYPE is used when naming and referencing this type
/// in a schema and the schema context did not provide an XML type name.

documentation  is more precise:

For an XML-enabled class or a property that is based on an XML-enabled class, the XML type is determined as follows:
If the class has a value for the XMLTYPE parameter, that is used as the type name.
Otherwise, the
short class name is taken as the XML type name.

so you would have 2 different classes with the same type:  CHILD
that's not allowed in an XML schema they have to be unique.

OK, There wasn't much echo so far.

The workaround was to encode the Description (and limit it for indexing) according to the language used.
The encoding is basically the position in the list of allowed/used characters or character groups.
If we use also numbers and interpunctuation it has to go into our list.

Instead of %String the descriptions are stored in a serial class:

Class DC.ArticleSort Extends (%SerialObject)
{
Property Language As %String [ InitialExpression = ];
Property Description As %String(MAXLEN = "");
Property Sort As %String(COLLATION = "EXACT", MAXLEN = 300) [  SqlComputed,
       ,
SqlComputeCode = { Set {*} = ##class(DC.ArticleSort).Encode({Language},{Description}) }
      ,
SqlComputeOnChange = (Description, Language) ];

ClassMethod Encode( Lang As %String, Desc As %String(MAXLEN="")) As %String(MAXLEN=300)
{ ...replace valid characters by binary postion value ..  }
}

It's obvious that for English and your installed NLS no encoding is required.
For triplets or doublets like in Hungarian, you need several runs  to encode

The Query itself has a minor change

SELECT TOP 10 ArtNr,DescHU_Description FROM DC.Article
      WHERE DescHU_Description %STARTSWITH 'BE'
      ORDER BY DescHU_Sort

The encoding is definitely not fast but change frequency is not an issue here and change happens
by typing in descriptions on the keyboard.

Query performance is supported by this index construct:

     Index IdxHU On DescHU.Sort [ Data = (ArtNr, DescHU.Description) ]; 

So the query plan just iterates over this index.