2011-04-20 2 views
1

J'utilise ruby ​​pour démarrer un service d'arrière-plan. Je stocke PID pour ce service pour le terminer plus tard. Disons que pour la simplicité j'ai besoin d'exécuter le service d'arrière-plan "sleep 1000". J'utilise cette commande et il fonctionne correctementLinux exécute un processus fils avec redirection sans engendrer un nouveau processus

child_pid = fork {exec("sleep 1000")} # => 7845 

ps 
7845 pts/15 00:00:00 sleep 

child_pid stocke PID du sommeil. Toutefois, lorsque j'essaie de rediriger la sortie standard vers un fichier (pour la journalisation), il se comporte différemment.

child_pid = fork {exec("sleep 1000 > sleep.log")} # => 7829 

Dans ce cas, child_pid est un PID d'un processus de sh, et le processus de sommeil prend un autre PID.

ps 
7829 pts/15 00:00:00 sh 
7832 pts/15 00:00:00 sleep 

Une explication à cela? Lorsque vous utilisez une commande simple, elle peut être exécutée directement.

Répondre

1

Les redirections (et les variables d'environnement, et ; et les tuyaux et un certain nombre d'autres choses) ne sont pas de simples commandes; ils sont syntaxe shell, donc Ruby démarre un shell pour les traiter. Si vous souhaitez éviter cela, vous devez effectuer la redirection dans Ruby dans le processus enfant fork ed avant le exec, en rouvrant la sortie standard dans le fichier de redirection.

Questions connexes