ulimit est une commande shell qui ne s'applique qu'au shell en cours et à ses descendants.
Tout à fait, sauf que mes paramètres sont persistants c'est à dire qu'ils sont bien stockés dans le fichier /etc/security/limits d'AIX et donc ils doivent s'appliquer à tous les environnements shell.
La fonction system en perl lance une commande shell. Et donc dans un sous shell puisque perl n'interprète pas le shell :)
Ce n'est pas parce que la commande "ulimit" n'est pas gérée par Perl qu'il y a création d'un nouveau process, c'est juste que c'est la fonction première de system() que de faire un fork() et donc un process shell (sh -c en locurence), donc le shell exécuté est effectivement bien fils de perl..
En effet, on pourrait pu tout aussi bien écrire exec("ulimit -a") où là le shell remplace le process perl le temps de l'exécution, enfin bref, le coeur du problème n'est pas là :-)
Par conséquent ta commande ulimit ne peut être prise en compte par perl qui et le père du shell ayant lancé la commande.
Mais je ne cherche pas à appliquer cette commande à perl, je cherche à comprendre pourquoi l'environnement du shell lancé par Perl est différent des autres !
Pour que la commande s'applique au processus en cours, il faut faire appel directement à l'appel système concerné. Je ne doute pas que tu puisse trouver ton bonheur dans le cpan.
merci mais ce n'est pas ce que je veux faire, je ne cherche pas à appliquer le paramètre au process en cours, et je connais quel est le module en question, il est même proposé dans la première URL de mes recherches.
L'autre solution est de lancer ton script perl dans un script shell qui fera lui-même la commande ulimit avant de lancer perl (son fils cette fois).
Comme précisé plus haut, mes paramètres ulimit sont persistants c'est à dire qu'il n'y a pas besoin de les spécifier au runtime, donc que je lance perl depuis un shell interactif ou non revient au même...
La preuve par l'exemple :
#!/usr/bin/ksh
ulimit -d unlimited
echo "Affichage des params effectifs sous shell"
ulimit -a
echo "Affichage des params effectifs sous le shell lancé par Perl"
perl << EOF
system("ulimit -a");
EOF
et le résultat :
Affichage des params effectifs sous shell
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) unlimited
memory(kbytes) unlimited
coredump(blocks) 2097151
nofiles(descriptors) 2000
Affichage des params effectifs sous le shell lancé par Perl
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) 2097152
stack(kbytes) unlimited
memory(kbytes) unlimited
coredump(blocks) 2097151
nofiles(descriptors) 2000
Tu constates comme moi que le paramètre data n'est pas le même, c'est que ce je ne comprends pas :-/
[^] # Re: Une histoire de famille
Posté par Dabowl_92 . En réponse au message Perl, AIX et les limits. Évalué à 2.
Tout à fait, sauf que mes paramètres sont persistants c'est à dire qu'ils sont bien stockés dans le fichier /etc/security/limits d'AIX et donc ils doivent s'appliquer à tous les environnements shell.
La fonction system en perl lance une commande shell. Et donc dans un sous shell puisque perl n'interprète pas le shell :)
Ce n'est pas parce que la commande "ulimit" n'est pas gérée par Perl qu'il y a création d'un nouveau process, c'est juste que c'est la fonction première de system() que de faire un fork() et donc un process shell (sh -c en locurence), donc le shell exécuté est effectivement bien fils de perl..
En effet, on pourrait pu tout aussi bien écrire exec("ulimit -a") où là le shell remplace le process perl le temps de l'exécution, enfin bref, le coeur du problème n'est pas là :-)
Par conséquent ta commande ulimit ne peut être prise en compte par perl qui et le père du shell ayant lancé la commande.
Mais je ne cherche pas à appliquer cette commande à perl, je cherche à comprendre pourquoi l'environnement du shell lancé par Perl est différent des autres !
Pour que la commande s'applique au processus en cours, il faut faire appel directement à l'appel système concerné. Je ne doute pas que tu puisse trouver ton bonheur dans le cpan.
merci mais ce n'est pas ce que je veux faire, je ne cherche pas à appliquer le paramètre au process en cours, et je connais quel est le module en question, il est même proposé dans la première URL de mes recherches.
L'autre solution est de lancer ton script perl dans un script shell qui fera lui-même la commande ulimit avant de lancer perl (son fils cette fois).
Comme précisé plus haut, mes paramètres ulimit sont persistants c'est à dire qu'il n'y a pas besoin de les spécifier au runtime, donc que je lance perl depuis un shell interactif ou non revient au même...
La preuve par l'exemple :
#!/usr/bin/ksh
ulimit -d unlimited
echo "Affichage des params effectifs sous shell"
ulimit -a
echo "Affichage des params effectifs sous le shell lancé par Perl"
perl << EOF
system("ulimit -a");
EOF
et le résultat :
Affichage des params effectifs sous shell
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) unlimited
memory(kbytes) unlimited
coredump(blocks) 2097151
nofiles(descriptors) 2000
Affichage des params effectifs sous le shell lancé par Perl
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) 2097152
stack(kbytes) unlimited
memory(kbytes) unlimited
coredump(blocks) 2097151
nofiles(descriptors) 2000
Tu constates comme moi que le paramètre data n'est pas le même, c'est que ce je ne comprends pas :-/