web-dev-qa-db-fra.com

La sortie lscpu diffère lorsqu'elle est appelée indirectement?

J'utilise lscpu | grep 'MHz' pour obtenir ma vitesse d'horloge. J'obtiens des résultats différents en fonction de la méthode que j'appelle cette commande.

Méthode 1: le taper dans le terminal
CPU MHz: 1200.000

Méthode 2: l'encapsulation dans un script appelé test.sh
Code de script:

#! /bin/bash
cpu=$(lscpu | grep 'MHz')
echo $cpu

Ensuite, dans le terminaL

$ chmod +x test.sh
$ ./test.sh

Production:
CPU MHz: 1200.000

Jusqu'ici tout va bien. Mais maintenant, méthode 3: afficher le "exécuter ou afficher le fichier actuel" dans Geany sur test.sh. Production:
CPU MHz: 2200.000

Méthode 4: écriture d'un script python appelé test.py qui appelle test.sh.
Code de script Python:

#! /usr/bin/python
import subprocess

def test():
    subprocess.call("./test.sh")

if __== '__main__':
    test()

Ensuite, dans le terminal:
$ python test.py

Production:
CPU MHz: 2200.000

J'ai essayé les deux python et python3. Les deux donnent le même résultat (erroné).

Pourquoi lscpu donne-t-il une sortie différente lorsqu'elle est exécutée indirectement? Et comment puis-je résoudre ce problème/contourner cela? Quelque chose ne va pas dans mon code? Pour ce que ça vaut, j'utilise Ubuntu 13.10.

Merci :-).

1
Gx1sptDTDa

C'est une coïncidence, c'est votre système qui change la fréquence actuelle du processeur.

Vérifiez avec cette commande dans un terminal:

watch -n 0 "lscpu | grep 'MHz'"

Vous verrez (en attendant un peu) que la fréquence du processeur du système commute.

Vous pouvez également obtenir votre fréquence CPU actuelle avec cette commande:

cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq

Et votre fréquence de processeur maximale/minimale avec celles-ci:

cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq

Changer le comportement? Le gouverneur cpu décide quelle fréquence doit être utilisée. Voir ceci documentation du noyau linux pour décider avec le gouverneur cpu qui vous convient le mieux.

  • Obtenez le gouverneur: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
  • Changez le gouverneur: echo "powersave" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
3
chaos

La plupart des processeurs modernes peuvent ajuster leur fréquence d'horloge. Le gouverneur par défaut sur Linux est "à la demande", ce qui maintient la vitesse d'horloge basse pour économiser de l'énergie lorsqu'elle est inactive et l'accélère pour faire le travail en cas de besoin.

Voir https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt

0
Sylvain Pineau