Hi,

Summary:

1. I execute script1 that will run in the background (daemon)
2. script1 needs to execute script2 and capture STDERR, STDOUT and exitcode from script2 if script2 exits before SIGTERM is received. 3. If I send SIGTERM to script1 it should kill script2, and write to DB (or log file some information that it was stopped)

Simple, isn't it? But I cannot seam to get it to work. Anyone with some example code that does the same thing?


=========

More complex description

I have some scripts (perl, c, php, or anything else) that simple independent scripts that do some stuff and output STDOUT and STDERR and exit with an exitcode. There scripts will be kept like this, and will not change their behavior.

Now I need to control them and also log their STDOUT, STDERR and exitcode. Ok, that far I have come, so that I am logging the STDOUT, STDERR and exitcode. What I am doing is that I have created an executer that takes care of this and writing it to DB.

Now I need to add a functionality so that when the executer receives a SIGTERM signal it should kill the script (that was started with a exec() call, and then log some information to the DB (that the script was killed etc).

I have registered the signal SIGTERM with pcntl_signal(SIGTERM, "sig_handler"). When I am testing I just write some info to a file when the signal is received. I created a simple testing script with a while(true) loop and then send the signal to the script and it successfully writes the information to the logflie.

Ok, now I instead of a while(true) loop make an exec() call to a script (that is running for ever) and send the signal, then it does not write to the file as it is supposed to. I guess it is because the script is busy running the exec command.

I tried to then exec() it in the background. The problem there is that it becomes a daemon and then I cannot know what that script is doing, and it will not send any SIGCHLD to the parent, or it does, but to init. Or actually there will be a SIGCHLD sent, as the exec() will open its own shell, and then the shell will exit and we get the SIGCHLD from the shell instead of the executed script.

Is there any way to get the "child" process PID when you exec() and send it to the background? But then, how can I capture the exitcode? The STDERR and STDOUT is fine as I can direct it to a file and get it from there.

I have a really ugly workarounds: I could append an dummy variable to the execution of the script and then do a grep of the ps -ef to get the PID of that script.

/Peter

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to