6
votes

Comment obtenez-vous combien de temps un processus est exécuté?

Y a-t-il un moyen d'obtenir ces informations à partir du répertoire / proc ? Je veux pouvoir obtenir combien de temps chaque processus est en cours.

Edit: J'avais besoin de le faire de C ++. Désolé pour la confusion.


1 commentaires

Voulez-vous dire combien le temps de CPU ou l'heure d'horloge?


6 Réponses :


3
votes

Vous pouvez faire stat / proc / {processID} pour voir le temps de création à la coquille.

EDIT: Fstat sur ce dossier devrait vous donner ce que vous voulez (le temps de création ).


3 commentaires

Bon appel. N'a pas pensé à vérifier lorsque le dossier a été créé. Merci!


Je ne pense pas que cela vous donne du temps de création de dossiers. Cela vous donne le temps de changement, de modifier le temps et l'heure d'accès. Aucun d'entre eux ne vous donne le temps que le dossier a été créé.


@kmdent: Par défaut, vous n'obtenez pas le temps de création, car tous les systèmes de fichiers ne le supportent pas, mais voient Stackoverflow.com/questions/5929419/... Pour une solution potentielle qui vous donne du temps de création.



0
votes

La commande horaire vous donnera cette information: xxx

arguments de ligne de commande le rendra retourner xxx

vous pouvez appeler < Code> Système (commande Char *) Pour exécuter la commande de votre PROG.


0 commentaires

1
votes

Décape ce que vous essayez de faire:

  1. Obtenir le temps que le fichier a été modifié. LI>
  2. Convertissez le temps en une fois UNIX. LI>
  3. Soustrayez les deux fois. LI> ol>

    Donc, afin d'obtenir l'heure actuelle, nous pouvons exécuter: p>

    timeval cur_time;
    double current_time, time_passed;
    char read_time[11]; // 32 bit overflows = only 11 digits.
    FILE *ourpipe;
    gettimeofday(&cur_time, NULL);
    current_time = cur_time.tv_sec + (cur_time.tv_usec * 1000000.0);
    // usec stands for mu second, i.e., a millionth of a second. I wasn't there when they named this stuff.
    ourpipe = fopen ("time_pipe", "rb"); 
    fread(read_time, sizeof (char), 10, ourpipe);
    time_passed = current_time - atoi (read_time);
    fclose (ourpipe);
    


2 commentaires

Modifier le temps est différent du temps de création. STATS donne la modification du temps, de l'heure d'accès et de la modification du temps. Ce n'est pas réellement vous donner le temps de création de processus. Êtes-vous d'accord?


@kmdent Oui, vous semblez avoir raison. Je suppose que l'alternative serait: PS-PID, ETIME (pour renvoyer la durée écoulée du PID). Je vais mettre à jour mon post en conséquence.



8
votes

Bon gars, donc après avoir lu le code source de la commande haut , j'ai trouvé une manière non hacable d'obtenir l'heure de début d'un processus. La formule qu'elles utilisent est la suivante: xxx

(vous devez diviser par Hz car Process_start_time est dans Jiffies)

Obtention de ces valeurs:

  • actuel_time - Vous pouvez obtenir ceci à partir de la commande C gettimeofday () .
  • boot_time - Cette valeur est située dans / proc / uptime . Ce fichier contient deux nombres: la disponibilité du système (secondes) et la quantité de temps passée dans le processus de ralenti (secondes). Prenez le premier.
  • process_start_time - Cette valeur est située dans / proc / [pid] / stat . La différence de temps (en jiffes) entre le démarrage du système et lorsque le processus a commencé. (La 22ème valeur dans le fichier si vous vous séparez sur WhitSpace).

    Le code (désolé, je mélange parfois C et C ++): xxx

    codage heureux!


3 commentaires

Merci pour l'extrait. Tout en mettant en œuvre ma propre version, j'ai réalisé qu'il n'est pas nécessaire de saisir l'heure actuelle. La formule est tout simplement up_time - Process_Start_Time / Hz.


J'ai vu sur un PAA appelé Codeanywhere que le BOOTTIME compte en millions, mais le / proc / uptime ou clock_montonique est la disponibilité appropriée. Cela vous donnera de mauvais résultats. Pour obtenir la disponibilité en Integer Utilisez SYSInfo, pour obtenir des heures de disponibilité dans un point flottant, vous devez lire / proc / uptime (la manutention du fichier est un peu plus aérien))


Si quelqu'un veut utiliser cette idée, reportez-vous à la référence Ceci



0
votes

/ proc / {processID} # bonne idée! p>

Mais pourquoi pas seulement lire / proc / {processid} / stat, et simplement obtenir toutes les statistiques que vous souhaitez? p>

de "Man Proc": p>

          cpu  3357 0 4313 1362393
                 The number of jiffies (1/100ths of a second)
                 that the system spent in user mode, user
                 mode with low priority (nice), system mode,
                 and the idle task, respectively.  The last
                 value should be 100 times the second entry
                 in the uptime pseudo-file.

          disk 0 0 0 0
                 The four disk entries are not implemented at
                 this time.  I'm not even sure what this
                 should be, since kernel statistics on other
                 machines usually track both transfer rate
                 and I/Os per second and this only allows for
                 one field per drive.

0 commentaires

0
votes

Un ancien sujet, mais depuis que je travaillais sur les mêmes problèmes, je pensais pouvoir poster ma réponse. Peut-être que ce serait utile pour quelqu'un d'autre. Remarque, ce code ne doit pas être utilisé dans un environnement de production sérieux, mais comme une solution rapide et sale d'obtenir ce que l'OP recherche, je pense que cela suffirait. Notez que ce code est le même code que OP posté en réponse à sa propre question, mais il est modifié pour pouvoir être compilé directement lorsque vous le copiez à Stackexchange, son code n'a pas été directement capable de compiler.

Ce code Compilez, et j'ai ajouté quelques fonctions supplémentaires. P>

Instructions: Démarrez n'importe quel programme, puis faire un 'PS AUX | Nom de programme 'pour obtenir son PID. C'est la deuxième colonne de la gauche. Maintenant, entrez ce numéro à PID dans la fonction principale et compilez le programme. Maintenant, lors de l'exécution du programme, la sortie sera quelque chose du genre: P>

Lapsed: jours: 0, Heures: 0, Min: 5, secondes: 58 P>

//Original code credit by kmdent.
//http://stackoverflow.com/questions/6514378/how-do-you-get-how-long-a-process-has-been-running
#include <iostream>
#include <iterator>
#include <sstream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cerrno>
#include <ctime>
#include <cstdio>
#include <fcntl.h>
#include <sys/time.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string>
#include "/usr/include/x86_64-linux-gnu/sys/param.h"

using namespace std;


template <class T>
inline std::string to_string (const T& t)
{
    std::stringstream ss;
    ss << t;
    return ss.str();
}

//Return the number of seconds a process has been running.
long lapsed(string pid) {

    int fd;
    char buff[128];
    char *p;
    unsigned long uptime;
    struct timeval tv;
    static time_t boottime;


    if ((fd = open("/proc/uptime", 0)) != -1) {
    if (read(fd, buff, sizeof(buff)) > 0) {
      uptime = strtoul(buff, &p, 10);
      gettimeofday(&tv, 0);
      boottime = tv.tv_sec - uptime;
    }
        close(fd);
    }

    ifstream procFile;
    string f = "/proc/"+pid+"/stat";
    procFile.open(f.c_str());

    char str[255];
    procFile.getline(str, 255);  // delim defaults to '\n'

    vector<string> tmp;
    istringstream iss(str);
    copy(istream_iterator<string>(iss),
         istream_iterator<string>(),
         back_inserter<vector<string> >(tmp));

    std::time_t now = std::time(0);
    std::time_t lapsed = ((now - boottime) - (atof(tmp.at(21).c_str()))/HZ);
    return lapsed;

}

string human_readable_lapsed(long input_seconds) {
    //Credit: http://www.cplusplus.com/forum/beginner/14357/
     long days = input_seconds / 60 / 60 / 24;
     int hours = (input_seconds / 60 / 60) % 24;
     int minutes = (input_seconds / 60) % 60;
     int seconds = input_seconds % 60;

     return "days: " + to_string(days) + " , hours: " + to_string(hours) + " , min: " + to_string(minutes) + " , seconds: " + to_string(seconds);
}

int main(int argc, char* argv[])
{
    //Pid to get total running time for.
    string pid = "13875";
    std::cout << "Lapsed: " << human_readable_lapsed(lapsed(pid)) << std::endl;
    return 0;
}


0 commentaires