parentless proces aanmaken

Pagina: 1
Acties:

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Hoe kan ik een process (onder bash) aanmaken dat geen parent process heeft.

Ik zit op dit moment het volgende issue:
als onderdeel van een aantal stappen dat genomen worden, heb ik een call voor het opstarten van een applicatieserver (onder java). Het vervelende is dat het systeem niet naar de volgende stap gaat, omdat het draaien van die applicatieserver voorlopig niet op gaat houden. Het parentprocess (de hoofdcall die ik doe) dat ik heb gestart, heeft nog een childproces (de appserver) dat niet afgelopen is, dus het parent proces houd niet op. Op het moment dat ik het childproces los kan koppelen, dan eindigt het hoofdprocess hopelijk wel.

Ik ben al met allerlei dingen aan het spelen geweest, zoals & aan het einde van het commando, maar tot zover heb ik eigelijk nog geen oplossing voor dit probleem.

Verwijderd

doe eens man nohup.

Wat nodig is, is dat het proces geen controlling terminal meer heeft. Daarmee komt het proces uiteindlijk onder init (1) te hangen en krijgt dus een andere process leader.
Hopelijk heb je hier wat aan.

Vicky

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Dat ziet er heel bruikbaar uit. Ik ga kijken of ik dat morgen kan fixen, hebben we weer een werkende cruise control. Bedankt. :*)

[ Voor 5% gewijzigd door Alarmnummer op 28-01-2007 15:33 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik heb net even gekeken, maar het child process heeft nog steeds een refeference naar het parent process. En het parentprocess is dus niet klaar omdat het child process niet is afgelopen.

Verwijderd

edit: nvm

[ Voor 95% gewijzigd door Verwijderd op 28-01-2007 15:48 ]


  • DataGhost
  • Registratie: Augustus 2003
  • Nu online

DataGhost

iPL dev

Alarmnummer schreef op zondag 28 januari 2007 @ 15:45:
Ik heb net even gekeken, maar het child process heeft nog steeds een refeference naar het parent process. En het parentprocess is dus niet klaar omdat het child process niet is afgelopen.
Je kan proberen iets met start-stop-daemon te fixen (afhankelijk van je distro), of je kan de server proberen te starten in een screen.

Verwijderd

Wat normaal in een daemon proces gebeurt, is dat er tweemaal fork() wordt aangeroepen. Hoe dat nu precies met bash gaat zou ik niet weten, maar wellicht is het dan handig om een simpele C executable te maken die je eerst daemonizet, en vervolgens start je dan de gewenste applicatie op vanuit het child proces, die dan geen parent meer heeft en is geadopteerd door init.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Wat een geklungel zeg. Ok, ik ga wel een fix maken in cruisecontrol zodat ik bij een draaien van een process niet ga wachten op het child process.

  • jschot
  • Registratie: Oktober 2002
  • Laatst online: 09-07-2025
Werkt het als je de bash builtin 'disown' gebruikt? Makkelijkste vorm:

commando & disown

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Je kan ook de fork & kill methode gebruiken in je code; indien java daarmee overweg kan en het toch alleen op linux/unix blijft. Anders gaat dat balletje niet op...

Denk aan zoiets (zelf vertalen naar java :P)

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  pid_t pid = fork();

  if (pid > 0)
  {
    // Dit is parent
    exit(0);
  }
  else if (pid < 0)
  {
    // Dit is erreur
    crashAndBurn();
  }
  else
  {
    // Child. Normaal sluit je hier stdout e.d...
  }
}

Verwijderd

GX schreef op zondag 28 januari 2007 @ 23:30:
Je kan ook de fork & kill methode gebruiken in je code; indien java daarmee overweg kan en het toch alleen op linux/unix blijft. Anders gaat dat balletje niet op...

Denk aan zoiets (zelf vertalen naar java :P)

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  pid_t pid = fork();

  if (pid > 0)
  {
    // Dit is parent
    exit(0);
  }
  else if (pid < 0)
  {
    // Dit is erreur
    crashAndBurn();
  }
  else
  {
    // Child. Normaal sluit je hier stdout e.d...
  }
}
Hij zegt dus net, dit krijgt dan de referentie naar de parent.

De oplossing is inderdaad een tweede fork in de child en dan de eerste child afkillen. De tweede is dan parentless.

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Oh, dat klopt ja, normaal los je dat op met een setsid() indien je de privileges daarvoor hebt. Maar normaal gezien word dit dan een child van init, wat m.i. "parentless" is..

[ Voor 0% gewijzigd door GX op 30-01-2007 11:16 . Reden: setpid() -> setsid() ]


  • igmar
  • Registratie: April 2000
  • Laatst online: 31-01 23:50

igmar

ISO20022

Alarmnummer schreef op zondag 28 januari 2007 @ 15:20:
Hoe kan ik een process (onder bash) aanmaken dat geen parent process heeft.
Niet. Processen zonder parent bestaan niet, en de enige 'uitzondering' is init.
Ik zit op dit moment het volgende issue:
als onderdeel van een aantal stappen dat genomen worden, heb ik een call voor het opstarten van een applicatieserver (onder java). Het vervelende is dat het systeem niet naar de volgende stap gaat, omdat het draaien van die applicatieserver voorlopig niet op gaat houden. Het parentprocess (de hoofdcall die ik doe) dat ik heb gestart, heeft nog een childproces (de appserver) dat niet afgelopen is, dus het parent proces houd niet op. Op het moment dat ik het childproces los kan koppelen, dan eindigt het hoofdprocess hopelijk wel.
Je zal dan een fork() moeten doen, eventueel in combinatie met een setsid().
Pagina: 1