Linux: renommez le processus affiché par la commande ps

--Une fonction appelée setproctitle est disponible sur certains systèmes --Linux n'a pas setproctitle par défaut. C'est gênant car il n'y a pas d'autre choix que de réécrire ʻargv [0] --Si vous écrivez un nom de commande plus long que l'original, cela détruira la zone avec les variables d'environnement après ʻargv [1], vous devez donc le copier à un autre emplacement à l'avance. --util-linux a une implémentation setproctitle pour Linux, vous pouvez donc facilement copier et coller ceci ―― Cependant, veuillez noter qu'il s'agit de la GPL.

Postscript: Quand je l'ai cherché, redis avait aussi une implémentation. Redis est une licence BSD.

test.c


/*
 *  set process title for ps (from sendmail)
 *
 *  Clobbers argv of our main procedure so ps(1) will display the title.
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

//#include "setproctitle.h"

#ifndef SPT_BUFSIZE
# define SPT_BUFSIZE     2048
#endif

extern char **environ;

static char **argv0;
static int argv_lth;

void initproctitle (int argc, char **argv)
{
  int i;
  char **envp = environ;

  /*
   * Move the environment so we can reuse the memory.
   * (Code borrowed from sendmail.)
   * WARNING: ugly assumptions on memory layout here;
   *          if this ever causes problems, #undef DO_PS_FIDDLING
   */
  for (i = 0; envp[i] != NULL; i++)
    continue;

  environ = malloc(sizeof(char *) * (i + 1));
  if (environ == NULL)
    return;

  for (i = 0; envp[i] != NULL; i++)
    if ((environ[i] = strdup(envp[i])) == NULL)
      return;
  environ[i] = NULL;

  argv0 = argv;
  if (i > 0)
    argv_lth = envp[i-1] + strlen(envp[i-1]) - argv0[0];
  else
    argv_lth = argv0[argc-1] + strlen(argv0[argc-1]) - argv0[0];
}

void setproctitle (const char *prog, const char *txt)
{
        int i;
        char buf[SPT_BUFSIZE];

        if (!argv0)
                return;

  if (strlen(prog) + strlen(txt) + 5 > SPT_BUFSIZE)
    return;

  sprintf(buf, "%s -- %s", prog, txt);

        i = strlen(buf);
        if (i > argv_lth - 2) {
                i = argv_lth - 2;
                buf[i] = '\0';
        }
  memset(argv0[0], '\0', argv_lth);       /* clear the memory area */
        strcpy(argv0[0], buf);

        argv0[1] = NULL;
}

//Fonction principale pour les tests
int main(int argc, char* argv[])
{
  initproctitle(argc, argv);
  setproctitle("hoge", "AIUEO");

  printf("Hello my pid = %d\n", getpid());
  sleep(10);
  
  return 0;
}

référence:

postgres ps_status.c Le changement de nom de commande est réalisé par différentes méthodes pour chaque plateforme.

/*
 * Alternative ways of updating ps display:
 *
 * PS_USE_SETPROCTITLE
 *	   use the function setproctitle(const char *, ...)
 *	   (newer BSD systems)
 * PS_USE_PSTAT
 *	   use the pstat(PSTAT_SETCMD, )
 *	   (HPUX)
 * PS_USE_PS_STRINGS
 *	   assign PS_STRINGS->ps_argvstr = "string"
 *	   (some BSD systems)
 * PS_USE_CHANGE_ARGV
 *	   assign argv[0] = "string"
 *	   (some other BSD systems)
 * PS_USE_CLOBBER_ARGV
 *	   write over the argv and environment area
 *	   (Linux and most SysV-like systems)
 * PS_USE_WIN32
 *	   push the string out as the name of a Windows event
 * PS_USE_NONE
 *	   don't update ps display
 *	   (This is the default, as it is safest.)
 */

Recommended Posts

Linux: renommez le processus affiché par la commande ps
Linux: comprendre les informations affichées par la commande top
[linux] commande kill pour tuer le processus
À propos du numéro (numéro de section) entre () affiché par la commande man Linux
Commande de confirmation de processus mémorandum d'option PS
Commande Linux n ° 4
Commande Linux n ° 3
[Linux] Comment utiliser la commande echo
Processus Linux
Linux: corriger l'adresse renvoyée par malloc
Notifier Slack lorsque la commande Linux se termine
Commande Linux n ° 5
Ajustez les autorisations des fichiers avec la commande Linux chmod
C'est un Mac. Qu'est-ce que la commande Linux Linux?
Liste des commandes Linux
linux à la commande
[Linux] Commande de recherche
[Linux] Comment afficher l'utilisation du processeur avec la commande ps, afficher l'en-tête et ne pas afficher le processus grep
Commande Linux <Basic 2>
Commande de serveur Linux
Mémo de commande Linux # 1
Commande Linux [lecture]
Résumé des commandes Linux
[Linux] Commande / connaissance
Ma commande Linux
Commande Linux <Basic 1>
commande ps "wchan"
Collection de commandes Linux
Commande mkdir Linux
Principes de base des commandes Linux
[Linux] Commande Git
Linux (mémoire de commande)
Afficher progressivement la sortie de la commande exécutée par le sous-processus.
[Linux] Exécutez périodiquement git pull avec la commande crontab
Ajouter un utilisateur Linux, comment utiliser la commande useradd
À propos du processus que le noyau Linux gère le microcode x86
Multiplier PDF par OCR en ligne de commande sous Linux (Ubuntu)
(Rappelez-vous rapidement) Comment utiliser la ligne de commande LINUX
Comprendre les attributs des fichiers Linux (commande ls -l)
Solution de contournement lorsque Authentification requise s'affiche lorsque vous essayez de visualiser le disque dur par USB en démarrant Linux