[UNIX] Zombie killer !

Derrière ce titre de film d’horreur de série B se cache une petite commande Solaris fort utile. Celle qui permet de se débarrasser des processus zombies.

Avant de vous livrer la commande en question, intéressons nous à la notion de processus zombie.

L’état Zombie d’un processus unix est un état de transition normal de la vie, et plutôt de la mort, d’un processus. En effet, une fois son exécution terminée, par un exit() par exemple, un processus passe à l’état zombie – c’est à dire mort, mais pas encore enterré :o ) – et envoie un signal à son parent pour le notifier de sa propre fin. Il s’agit du signal SIGCHLD (« sig child »). Si celui ci est bien codé, il consomme le signal en utilisant un des appels de type wait ou waitpid ce qui a pour effet de supprimer définitivement le zombie.

Avoir des zombies, est-ce que c’est grave docteur ? Pas vraiment, tant qu’ils ne s’accumulent pas. Ils ne consomment en effet plus de ressource, (mémoire ou CPU) puisqu’ils ont été libérés. La seule chose qu’ils consomment ce sont des entrées dans les tables de processus, ce qui peut à la longue devenir un peu gênant, voire embêtant lorsqu’on atteint le nombre maximal de processus sur un système, mais cela reste rare.

Bon d’accord, mais c’est moche dans un ps, alors comment faire pour s’en débarrasser ?

La bonne vieille méthode: tuer le père. Un processus ne peut pas se trouver sans père, donc lorsqu’un père est tué, ses enfants sont rattachés à leur grand père, et ce jusqu’à l’abraham des processus, j’ai nommé init. Le process init, lui, est bien codé, il est même prévu pour rattrapper le coup aux développeurs distraits. Il fait régulièrement des wait sur ses fils, qui s’ils sont déjà zombies disparaissent comme par enchantement.

L’autre méthode, plus élégante, d’abord parce qu’elle ne fait pas l’apologie du meurtre de processus, mais aussi parce qu’elle permet de nettoyer les zombies sans avoir a terminer un programme potentiellement encore utile pour ce faire: preap. Je vous renvoie au man ce cette commande pour les détails, et en particulier ses quelques restrictions.

Démonstration:
D’abord écrivons un programme mal écrit (oh!):

#include <stdlib.h>
#include <stdio.h>

int main(void) {
        int pid;

        pid = fork();
        if (pid == 0) { // je suis dans le fils
                printf("\tJe suis le fils\n");
                printf("\tJe dors 10 secondes\n");
                sleep(10);
                printf("\tje m'arrete\n");
                exit(0);
        }
        else { // je suis dans le pere
                printf("Je suis le pere\n");
                printf("Mon fils s'appelle: %d\n",pid);
                while (1) {
                        printf("je dors 10 secondes\n");
                        sleep(10);
                }
        }
}

Et testons le:

vincent@sauron:~/articles/zombie-killer$ ./test
Je suis le pere
Mon fils s'appelle: 621
je dors 10 secondes
        Je suis le fils
        Je dors 10 secondes
je dors 10 secondes
        je m'arrete
je dors 10 secondes
je dors 10 secondes
je dors 10 secondes
je dors 10 secondes
je dors 10 secondes
je dors 10 secondes
je dors 10 secondes
^C
vincent@sauron:~/articles/zombie-killer$

En parallèle

vincent@sauron:~$ ptree  500
439   /usr/lib/ssh/sshd
  494   /usr/lib/ssh/sshd
    495   /usr/lib/ssh/sshd
      500   -bash
        620   ./test
          621   ./test
vincent@sauron:~$ ptree  500
439   /usr/lib/ssh/sshd
  494   /usr/lib/ssh/sshd
    495   /usr/lib/ssh/sshd
      500   -bash
        620   ./test
          621   <defunct>
vincent@sauron:~$ preap 621
preap: unsafe to reap 621; it has been defunct less than 60 seconds
vincent@sauron:~$ preap 621
621: exited with status 0
vincent@sauron:~$ ptree  500
439   /usr/lib/ssh/sshd
  494   /usr/lib/ssh/sshd
    495   /usr/lib/ssh/sshd
      500   -bash
        620   ./test

Dommage qu’une telle commande n’existe pas pour linux.

[UNIX] Nexenta: un systeme GNU/Solaris

Comment concilier la souplesse de gestion d’une distribution debian avec un noyau OpenSolaris: vous en avez rêvé, nexenta l’a fait.

Je viens d’installer la version NexentaCore 3.0 (encore en version alpha) sur mon vieux barebone qui me sert un peu à tout faire mais surtout à faire des tests. J’avais envie de jouer un peu avec OpenSolaris, avant qu’il ne disparaisse … (!!!)

Direction http://www.nexenta.org le temps de télécharger l’iso, puis de le graver sur un CD et c’est parti. L’OS s’installe en 10 minutes, pour peu d’être un peu habitué à l’installeur debian on s’y retrouve bien.

Pour concerver mon ubuntu en dual boot avec ce nouvel OS, j’ai juste suivi une petite procédure trouvée dans la FAQ de nexenta.org: Utiliser le grub de ubuntu sur le disque primaire, configurer une entrée en chainloader sur le deuxieme disque puis permuter physiquement les disques le temps de l’installation. Et enfin revenir à l’état initial une fois l’installation terminée.

Tout ceci pour arriver en moins d’une demi heure au résultat suivant:

[vincent@Amyrlin ~ 14:57:54] ssh sauron
Password:
Last login: Sun Mar  7 05:56:33 2010 from 192.168.1.3
vincent@sauron:~$ uname -a
SunOS sauron 5.11 NexentaOS_20090926 i86pc i386 i86pc Solaris
vincent@sauron:~$ zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
syspool                 1.09G   107G    26K  none
syspool/rootfs-nmu-000  1.09G   107G   878M  legacy
vincent@sauron:~$ pkginfo SUNWcsu
base         SUNWcsu                  Core Solaris, (Usr)
vincent@sauron:~$ apt-cache show sunwcsu
Package: sunwcsu
Essential: yes
Status: install ok installed
Priority: required
Section: base
Installed-Size: 20496
Maintainer: Erast Benson <erast@gnusolaris.org>
Architecture: solaris-i386
Version: 5.11.124-1
Replaces: ksh, mailx
Provides: ksh, mailx
Depends: hostname, nexenta-lu (>= 5.11.124-1), sunwcsd (>= 5.11.124-1), sunwcsl (>= 5.11.124-1), sunwcslr (>= 5.11.124-1), sunwcsr (>= 5.11.124-1)
Conflicts: ksh, mailx
Description: Core Solaris, (Usr)
 core software for a specific instruction-set architecture
 .

[photo] Flou artistique

banniere_gerbera_coeur

L’occasion était trop belle, ce dimanche, de mettre en pratique un truc que j’avais déjà vaguement essayé il y a quelques mois après en avoir glané l’idée sur un groupe flickr.
Il s’agit de réaliser une photo avec du bokeh en forme de coeur.

La technique elle même n’est pas si difficile. Le bokeh c’est cette multitudes de taches colorées rondes faites dans les zones brillantes et floues de l’arrière plan d’une image. On le voit souvent dans des photos de ville de nuit, où chaque lumière de la nuit devient une source de bokeh pour qui a un objectif suffisamment lumineux. Ces taches sont rondes parceque le diaphragme est rond (ou presque) et en fait on comprend aisément pourquoi. La lumière de l’arrière plan flou, au lieu de se concentrer au centre de la lentille, doit prendre n’importe quel chemin et se « cogner » contre les parois du diaphragme. Mais alors, si on arrivait à faire un diaphragme d’une forme particulière, n’obtiendrait-on pas une forme de bokeh particulière ? Eh bien oui. C’est tout le principe du bokeh à forme…

Lire la suite …

[Photo] Une abeille au travail

Working Bee

Voici, pour se faire plaisir, une petite photo prise cet été d’une abeille en train de butiner.

Pour seul dispositif, j’avais mon Nikon D300, mon objectif macro Tamron 90, et mon flash SB 900 monté sur le boitier. J’ai aussi ouvert au maximum, mais en conservant une profondeur de champ acceptable, pour pouvoir déclencher assez vite et que l’abeille ne soit pas trop floue. Bref tout ça a été réglé en manuel, sinon je pense que l’appareil n’aurait pas réussi à s’en sortir :)

Lire la suite …

Inauguration de l’Apple Store du Louvre, Paris

Apple Store: Paris Louvre

Voici la Cérémonie d’ouverture de l’Apple-Store du Carrousel du Louvre. C’est le premier Apple-Store de France. Cette photo a été prise quelques minutes (secondes) avant l’ouverture même. On peut y voir le staff qui applaudit les clients massés devant les portes.

Lire la suite …

Réaliser un film HDR en timelapse

Le timelapse ou film accéléré, comme le définit cet article wikipedia, consiste à projeter un film plus vite qu’il n’a été pris. Ou plus précisément, à exposer un film plus lentement qu’on ne va le projeter (24 images par seconde en général), ce qui a pour effet d’accélérer le mouvement des sujets.

Si on pousse la technique à l’extrême, c’est ce genre de méthode qui permet de voir une fleur pousser ou une journée passer en quelques secondes. Et cela peut être réalisé avec un appareil photo. En effet il suffit pour cela de prendre des images avec un cadrage constant, à intervalles réguliers puis de les assembler à 24 images/s (ou un peu moins) pour en donner l’illusion d’un film.

Enfin si on combine à cela la technique décrite ici pour réaliser des photos HDR (a haute dynamique) on obtient un film HDR en accéléré.

Tout cela est réalisable avec le Nikon D300 et un bon trépied. Lisez la suite pour comprendre comment je m’y suis pris avec Photomatix, ImageMagick et Quicktime.

Lire la suite …

Twin flowers

Twin trumpets


Twin trumpets

Pendant notre marche autour du lac Trübsee, au dessus de Engelberg, nous trouvé plein de fleurs de montagne, donc je n’ai d’ailleurs aucune idée des noms, et dont vous avez pu observer une partie déjà. J’ai particulièrement apprécié ces deux là. Fragiles, blanches avec une petite tâche jaune comme un petit soleil. Elles me faisaient penser à deux petites trompettes jouant dans le vent.

Bon week end à tous.

Camera Model: NIKON D300, Lens: 90 mm f/2.8, Focal length: 90 mm, Exposure: ¹⁄₂₀₀ s à f/10 ISO 200

Voir sur fond noir

Perdu dans les nuages

Lost in the clouds

Voici une dernière vue du lac Trübsee au dessus de Engelberg, en Suisse. Vous atteignez ce point de vue depuis un petit parc de jeux à quelques minutes du haut de la station de télécabine.

Pour faire cette image, j’avais un filtre polarisant pour avoir de bons reflets sur le lac et un ciel bien saturé. J’ai aussi utilisé un filtre gris neutre ND8 pour allonger la pause, et avoir c’est effet un peu gelé sur la surface du lac. Le seul problème avec ça c’est que mon filtre tire un peu au magenta, j’ai donc du jouer un peu avec la couleur dominante et la balance des blancs dans Lightroom. J’ai aussi assombri un peu le ciel pour lui donner un peu plus de profondeur.

Camera Model: NIKON D300, Lens: 18-70 mm f/3.5-4.5, Focal length: 24 mm, Exposure: 1,6 s à f/22 ISO 200

Voir sur fond noir


Vin0×64 is Digg proof thanks to caching by WP Super Cache

30