Question

Pour mes applications Java avec des chemins de classes très longs, je ne peux pas voir la classe principale spécifiée à la fin de la liste des arguments lors de l'utilisation de ps. Je pense que cela provient de la taille limite de mon système Ubuntu sur / proc / pid / cmdline. Comment puis-je augmenter cette limite?

Était-ce utile?

La solution

Vous ne pouvez pas changer cela dynamiquement, la limite est codée en dur dans le noyau en PAGE_SIZE dans fs / proc / base.c:

 274        int res = 0;
 275        unsigned int len;
 276        struct mm_struct *mm = get_task_mm(task);
 277        if (!mm)
 278                goto out;
 279        if (!mm->arg_end)
 280                goto out_mm;    /* Shh! No looking before we're done */
 281
 282        len = mm->arg_end - mm->arg_start;
 283 
 284        if (len > PAGE_SIZE)
 285                len = PAGE_SIZE;
 286 
 287        res = access_process_vm(task, mm->arg_start, buffer, len, 0);

Autres conseils

Pour examiner les processus Java jps est très utile.

Ceci vous donnera la classe principale et les arguments jvm:

jps -vl | grep <pid>

Je contourne temporairement la limitation de ps (ou plutôt / proc / PID / cmdline) sur la ligne de commande de 4096 caractères en utilisant un petit script pour remplacer la commande java.

Pendant le développement, j'utilise toujours une version JDK décompressée de SUN et je n'utilise jamais le JRE ou le JDK installé du système d'exploitation, que ce soit sous Linux ou Windows (par exemple, télécharger la corbeille plutôt que le fichier rpm.bin). Je ne recommande pas de modifier le script pour votre installation Java par défaut (par exemple, car cela pourrait interrompre les mises à jour ou être écrasé ou créer des problèmes ou ...)

En supposant que la commande java soit dans /x/jdks/jdk1.6.0_16_x32/bin/java

déplacez d'abord le binaire réel:

mv /x/jdks/jdk1.6.0_16_x32/bin/java /x/jdks/jdk1.6.0_16_x32/bin/java.orig

créez ensuite un script /x/jdks/jdk1.6.0_16_x32/bin/java comme par exemple:

    #!/bin/bash

    echo "$@" > /tmp/java.$.cmdline
   /x/jdks/jdk1.6.0_16_x32/bin/java.orig $@

puis rendre le script exécutable

chmod a+x /x/jdks/jdk1.6.0_16_x32/bin/java

en cas de copier-coller de ce qui précède, vous devez vous assurer qu'il n'y a pas d'espaces supplémentaires dans /x/jdks/jdk1.6.0_16_x32/bin/java et que #! / bin / bash est la première ligne

La ligne de commande complète se termine par ex. /tmp/java.26835.cmdline où 26835 est le PID du script shell. Je pense qu’il existe également une limite au nombre d’arguments en ligne de commande, impossible à retenir, mais il s’agissait peut-être de 64 Ko.

vous pouvez modifier le script pour supprimer le texte de la ligne de commande de /tmp/java.PROCESS_ID.cmdline à la fin

Après avoir reçu la ligne de commande, je déplace toujours le script vers quelque chose comme "java.script". et copier (cp -a) le fichier binaire java.orig actuel dans java. J'utilise le script uniquement lorsque la limite de 4K est atteinte.

Il peut y avoir des problèmes avec les caractères échappés et peut-être même des espaces dans les chemins ou autres, mais cela fonctionne très bien pour moi.

Vous pouvez utiliser jconsole pour accéder à la ligne de commande d'origine sans respecter les limites de longueur.

Il est possible d'utiliser des distributions Linux plus récentes, où cette limite a été supprimée, par exemple RHEL 6.8 ou une version ultérieure

"La limite de longueur de fichier / proc / pid / cmdline pour la commande ps était précédemment codée en dur dans le noyau à 4096 caractères. Cette mise à jour garantit que la longueur de / proc / pid / cmdline est illimitée, ce qui est particulièrement utile pour répertorier les processus avec des arguments de ligne de commande longs. (BZ # 1100069) "

https: // accès. redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/6.8_Release_Notes/new_features_kernel.html

Pour les programmes basés sur Java dans lesquels vous souhaitez uniquement examiner les arguments de ligne de commande que votre classe principale a obtenus, vous pouvez exécuter:

jps -m

Je suis à peu près sûr que si les arguments tronqués dans / proc / $ pid / cmdline sont tronqués, vous dépassez la longueur maximale des arguments prise en charge par le système d'exploitation. Autant que je sache, sous Linux, la taille est limitée à la taille de la page en mémoire. Voir " ps ww " restriction de longueur pour référence.

Le seul moyen de contourner ce problème serait de recompiler le noyau. Si vous souhaitez aller aussi loin pour résoudre ce problème, vous pouvez trouver ce message utile: " Liste d'arguments Trop long " ;: Au-delà des arguments et des limitations

Référence additionnelle:
ARG_MAX, longueur maximale des arguments d'un nouveau processus

Peut-être que le paramètre 'w' à ps est ce que vous voulez. Ajoutez deux 'w' pour une plus grande sortie. Il indique à ps d’ignorer la largeur de ligne du terminal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top