Execute the Shell command and continue executing the algorithm

Krzysztof Jajeśnica krzysztof.jajesnica at gmail.com
Mon May 30 13:30:55 UTC 2022


On Monday, 30 May 2022 at 11:18:42 UTC, Alexander Zhirov wrote:
> I want to run a command in the background during the execution 
> of the algorithm, and without waiting for its actual execution, 
> because it is "infinite", while continuing the execution of the 
> algorithm and then, knowing the ID of the previously launched 
> command, kill the process. So far I have done so:
>
> ```d
> // Here a long program is launched, as an example `sleep`
> executeShell("(sleep 10000 && echo \"SLEEP\" >> log) &");
>
> while (!interrupted)
> {
>     // some algorithm is executed here, for example `echo`
>     executeShell("(echo \"OK\" >> log) &");
>     if (here is my condition termination of the program)
>     {
>         // Here is the termination of the running program
>     }
>     Thread.sleep(1.seconds);
> }
> ```
>
> How to organize such an algorithm correctly?

You could use 
[`spawnShell`](https://dlang.org/phobos/std_process.html#spawnShell) instead of `executeShell` to spawn the long-running process. `spawnShell` will return the PID of the spawned process, which you can later use to kill it with the `kill` function.
```d
import core.stdc.signal : SIGINT;
import std.process;

/* note: with spawnShell you don't need & at the end of command,
    because spawnShell doesn't wait for spawned process to 
complete */

Pid pid = spawnShell("(sleep 10000 && echo \"SLEEP\" >> log)");

while (!interrupted)
{
     // some algorithm is executed here, for example `echo`
     executeShell("(echo \"OK\" >> log) &");
     if (here is my condition termination of the program)
     {
         /* Kill the previously spawned process using SIGINT 
signal */
         kill(pid, SIGINT);
         /* Wait for the killed process to shutdown */
         wait(pid);
     }
     Thread.sleep(1.seconds);
}
```


More information about the Digitalmars-d-learn mailing list