2010-01-15 23 views
1

Je suis en train d'écrire un script Perl pour lequel j'ai besoin du temps de fonctionnement en quelques secondes pour faire des calculs, dans toutes les machines du magasin (c'est-à-dire Linux, SunOS et AIX). J'ai un moyen d'obtenir le temps de disponibilité pour linux (/ proc/uptime), et SunOS (kstat -p unix: 0: system_misc: boot_time), grâce à une autre publication sur ce site, mais je peux trouver un bon moyen d'obtenir pour AIX. Je n'aime pas vraiment l'idée d'analyser le temps de disponibilité avec reg-ex, car les temps de disponibilité changent lorsque la machine est en mode de fonctionnement sec, minutes, jours ou plus d'un an.Comment puis-je obtenir la disponibilité d'une boîte IBM AIX en quelques secondes?

Répondre

0

Analyser la sortie de last(1)?

Trouver un fichier/répertoire créé/actualisé uniquement au moment du démarrage et le signaler? Franchement, l'utilisation de différentes regex pour gérer les différentes sorties possibles de uptime ne semble pas si mauvaise.

0

Cet extrait de C fonctionne sous AIX 6.1. Je ne peux pas vous donner l'article source car je n'ai plus que le code source.

#include <utmpx.h> 
int main () 
{ 
    int nBootTime = 0; 
    int nCurrentTime = time (NULL); 
    struct utmpx * ent; 

    while ((ent = getutxent ())) { 
     if (!strcmp ("system boot", ent->ut_line)) { 
      nBootTime = ent->ut_tv.tv_sec; 
     } 
    } 
    printf ("System was booted %d seconds ago\n", nCurrentTime - nBootTime); 
} 
0

Répondre à l'ancien thread pour les nouveaux utilisateurs potentiels.

Nous allons créer un programme C léger appelé getProcStartTime pour lequel vous aurez beaucoup d'autres utilisations. Il vous indique quand un processus a été lancé, compte tenu du PID. Je crois que vous aurez toujours un timbre à la seconde, même si le processus a commencé il y a des mois ou des années. Enregistrez ce code source en tant que fichier appelé getProcStartTime.c:

#include <time.h> 
#include <procinfo.h> 

main(argc, argv) 
char *argv[]; 
{ 
    struct procentry64 psinfo; 
    pid_t pid; 
    if (argc > 1) { 
    pid = atoi(argv[1]); 
    } 
    else { 
    printf("Usage : getProcStartTime pid\n"); 
    return 1; 
    } 
    if (getprocs64(&psinfo, sizeof(struct procentry64), NULL, sizeof(struct fdsinfo64) , &pid, 1) > 0) { 
    time_t result; 
    result = psinfo.pi_start; 
    struct tm* brokentime = localtime(&result); 
    printf("%s", asctime(brokentime)); 
    return 0; 
    } else { 
    perror("getproc64"); 
    return 1; 
    } 
} 

compilez Ensuite, il:

gcc getProcStartTime.c -o getProcStartTime 

est ici la logique magique: AIX comme Linux a un processus appelé init avec PID 1. Il ne peut pas être tué ou redémarré. L'heure de démarrage de PID 1 est donc l'heure de démarrage de votre serveur.

./getProcStartTime 1 

Sur mon serveur, retourne Mer 23 avril 2014 10:33:30; le vôtre sera différent. Remarque, à l'origine, j'ai fait getProcStartTime spécifiquement à cet effet, mais maintenant je l'utilise dans toutes sortes d'autres scripts. Vous voulez savoir depuis combien de temps une base de données Oracle a été créée? Trouvez le PID du PMON d'Oracle et passez ce PID comme argument après getProcStartTime.

Si vous voulez vraiment que la sortie soit un nombre entier de secondes, ce serait un exercice de programmation facile pour modifier le code ci-dessus. Le nom getProcUptime est juste une suggestion. Ensuite, vous pouvez simplement appeler:

./getProcUptime 1 

MISE À JOUR: code source et précompilé binaire pour AIX 6.1/7.1 ont été mis sur mon repo Github ici: https://github.com/Josholith/getProcStartTime

+0

Salut Joshua, dans mon environnement actuel AIX paradis I compilateur gcc. Puis-je utiliser cpp pour compiler votre code? Avez-vous une version compilée? Merci beaucoup d'avance. –

+0

@FabrizioA, faites un essai avec 'cpp'. Le code est simplement C, donc je ne vois pas pourquoi cela ne devrait pas fonctionner.Au cas où cela ne fonctionnerait pas, je l'ai juste téléchargé sur mon repo github, incluant à la fois la source et le binaire compilés sur AIX 6.1 (mais fonctionne aussi sur 7.1). https://github.com/Josholith/getProcStartTime –

+0

Merci beaucoup @Joshua Huber pour votre script. Cependant j'ai un problème avec cela, si j'exécute ./getProcStartTime 1 (j'ai besoin du temps de disponibilité du système) j'obtiens l'erreur "getproc64: argument invalide" ... une suggestion? Ma version d'AIX est 5.3.0.0 –