Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1. Re:  forkProcess behaviour (Michael Snoyman)
   2. Re:  forkProcess behaviour (PICCA Frederic-Emmanuel)


----------------------------------------------------------------------

Message: 1
Date: Thu, 19 Jul 2018 16:58:13 +0300
From: Michael Snoyman <mich...@snoyman.com>
To: Beginners <beginners@haskell.org>
Subject: Re: [Haskell-beginners] forkProcess behaviour
Message-ID:
        <CAKT9ecP=68mbven2ebxenvrque2h3db-pm-ep+_pqezgkqv...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

Hi Frederic,

Let me give a high level recommendation: don't use forkProcess. It's a very
dangerous function, which can result in confusing behavior and
impossible-to-debug problems. There are cases where it can be made to work,
but (1) it's complicated, (2) I'm not sure anyone has ever figured out all
of those caveats, and (3) it's certainly not documented properly.

forkProcess is little more than a call to the fork() system call, creating
a brand new child process which will run the IO action provided. The
runtimes of the two processes will not be connected to each other at all.
It would be impossible to, say, throw an exception from a thread in the
parent process to a thread in the child process.

I could say a lot more about this, but I think I'll just reiterate my
original recommendation: don't use forkProcess :)

Instead, for this kind of use case of changing user/group IDs, I'd
recommend using a normal external process call via the process package[1].
I'm not sure of your use case exactly, but I see three ways of making this
work:

* Generate two Haskell executables
* Put the code for both the parent and child into a single executable, and
use command line arguments or env vars to control which behavior is run
* If you don't have any real logic in the Haskell code, and instead are
just using some other program: you can call that directly

HTH,
Michael

[1] Or the typed-process package instead, which I typically recommend these
days. Note that I'm the maintainer of process, but typed-process has a
brand new API I think is easier to use correctly. More info at:
https://haskell-lang.org/library/typed-process

On Tue, Jul 17, 2018 at 3:36 PM PICCA Frederic-Emmanuel <
frederic-emmanuel.pi...@synchrotron-soleil.fr> wrote:

> Hello,
>
> I try to write a service which execute an IO using forkProcess
> This service contain a web server whcih avwait for job published by users.
> for each job, I create a forkProcess of this job. I need to fork the
> process in order to change the uid and gid of the process for each of the
> job dependencing on who request the job.
>
> I have a least two questions
>
> 1) is this forkProcess a fork of all the current process, or is it just an
> executin of the IO in another process id ?
>
> I ask this because sometime one of my job hang and a process keep running.
> Since the original process is binded to a port, it is not possible to
> restart the server, saying that the port is already in use.
>
> 2 ) How can I catch the exceptions thrown from the child process in order
> to process them in the parent process.
>
> thanks for your help answering these questions.
>
>
> Frederic
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20180719/69d83a6c/attachment-0001.html>

------------------------------

Message: 2
Date: Fri, 20 Jul 2018 07:19:34 +0000
From: PICCA Frederic-Emmanuel
        <frederic-emmanuel.pi...@synchrotron-soleil.fr>
To: "The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell" <beginners@haskell.org>
Subject: Re: [Haskell-beginners] forkProcess behaviour
Message-ID:
        
<a2a20ec3b8560d408356cac2fc148e530107e2b...@sun-dag4.synchrotron-soleil.fr>
        
Content-Type: text/plain; charset="iso-8859-1"

> Hi Frederic,

Hello Michael

Thanks a lot for your informative answer.

> Let me give a high level recommendation: don't use forkProcess. It's a very 
> dangerous function, which can result in confusing behavior and 
> impossible-to-debug problems. There are cases where it can be made to work, 
> but (1) it's complicated, (2) I'm not sure anyone has ever figured out all of 
> those caveats, and (3) it's certainly not documented properly.

> forkProcess is little more than a call to the fork() system call, creating a 
> brand new child process which will run the IO action provided. The runtimes 
> of the two processes will not be > connected to each other at all. It would 
> be impossible to, say, throw an exception from a thread in the parent process 
> to a thread in the child process.

> I could say a lot more about this, but I think I'll just reiterate my 
> original recommendation: don't use forkProcess :)

> Instead, for this kind of use case of changing user/group IDs, I'd recommend 
> using a normal external process call via the process package[1]. I'm not sure 
> of your use case exactly, > but I see three ways of making this work:

> * Generate two Haskell executables
> * Put the code for both the parent and child into a single executable, and 
> use command line arguments or env vars to control which behavior is run
> * If you don't have any real logic in the Haskell code, and instead are just 
> using some other program: you can call that directly

I am quite close to this model, since I have only once executable and the 
command line parameters allows to execute the different job like this

autoprocessing-exe [exec|submit|server] <jobname> parameters

I start my service via the server command without parameters.
Then from another computer, I can submit jobs to that server.
And locally I can execute jobs with the exec command.

What you proposed is just to execute the autoprocessing-command line with 
s/submit/exec in order to execute a child process.

I think that I can do this.

Now sometimes this process hang and I want to add a timeout, can I just use 
timeout for this purpose.

2) I do not want to have communication between my server process and the child 
one, so in that case is it worth changing the code in order to use process 
instead of forkPRocess.

With process I will need to had lot's of code in oder to convert my job type 
into command line.

I have for now the right Parser command line -> jobtype, but not the other way 
around.
This is why I used forkProcess et first.

Once again thanks for your valuable comments.

Frédéric

------------------------------

Subject: Digest Footer

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


------------------------------

End of Beginners Digest, Vol 121, Issue 18
******************************************

Reply via email to