Programmaufruf mit Variable erzeugt mehr Prozesse als ohne

FatManStanding

Lieutenant
Registriert
Aug. 2021
Beiträge
519
Hallo,

ich hoffe der Titel ist halbwegs verständlich. Wenn ich das Script 'test2' mit diesem Inhalt starte

Code:
while true; do
 mon_state=$(sudo ddcutil -d 1 getvcp d6 --terse | cut -d " " -f 4)
done

sehe ich im Prozessmanager einen Prozess 'test2' mit mehr oder weniger vielen Kindprozessen (siehe Screenshot). Starte ich das ganze aber ohne die Ausgabe in einer Variable zu schreiben habe ich immer nur einen Prozess 'test2' ohne Kindprozesse. Wieso?

Code:
while true; do
 sudo ddcutil -d 1 getvcp d6 --terse | cut -d " " -f 4
done

BTW. 'ddcutil' ist so etwas wie HDMI-CEC für Monitore. Man kann den Status (an/aus) eines Monitors prüfen und den Eingang wechseln. Sehr praktisch wenn man GPU-Passthrough eingerichtet hat.
Das Tool braucht 'sudo', wird bei mir aber ohne Passworteingabe gestartet da ich es in sudoers eingetragen habe.
 

Anhänge

  • 2024-08-09_20-27-44.png
    2024-08-09_20-27-44.png
    11,7 KB · Aufrufe: 120
  • Gefällt mir
Reaktionen: Mickey Cohen
Ist nicht $( )
schon ein Programmaufruf, eben einer shell inder das was in der Klammer steht ausgeführt wird?

Ich vermute das jedenfalls als ersten Prozess in dem Fall.
 
  • Gefällt mir
Reaktionen: tollertyp
Naja die Ausgabe der Befehle muss ja abgefangen werden damit die der Variable zugewiesen wird, das muss im Hintergrund in einer sozusagen virtuellen shell passieren die von der Ausgabe getrennt von der aktuellen ist

Auf der aktuellen könnte ja irgendein anderes Programm das im Hintergrund läuft auf den "Ausgabebildschirm" schreiben.
 
Wenn man das ungebremst in einer Endlosschleife aufruft, kann vermutlich alles passieren. Die roten Einträge existieren aber nicht mehr. Der Taskmanager lässt die lediglich "nachglühen", damit der User das sehen kann. Mit anderen Worten: Da ist auch nur ein Prozess. Der Rest ist wahrscheinlich nur Racecondition.
 
  • Gefällt mir
Reaktionen: Bohnenhans
Dann vielleicht sinnvollerweise ein sleep reinmachen in die schleife

da gehen auch teile von sekunden z.b. sleep .5

Denke ein sleep 1 oder 2 würde da auch passen und entlastet die cpu sicher deutlich.

UInd das ganze mit nice -n 19 starten :D
 
OK, das mit den roten Prozessen war interessant. Ich dachte die laufen alle gleichzeitig.
 
Alexander2 schrieb:
Ist nicht $( )
schon ein Programmaufruf, eben einer shell inder das was in der Klammer steht ausgeführt wird?
Da wird eine weitere subshell gestartet, was man mit einen "strace -f -e process foo" nachvollziehen kann.
 
  • Gefällt mir
Reaktionen: Kuristina
$() macht ja scheinbar einen Sub-Prozess auf. Halte ich für keine gute Idee das endlos zu machen.
Wenn du einfach nur die Ausgabe von dem Befehl in eine Variable schreiben willst verwendet man eigentlich mit ` in der Bash (so kenne ich das zumindest ;) )
Kann es gerade nicht testen.


Bash:
#!/usr/bin/bash

while true; do
 mon_state=`sudo ddcutil -d 1 getvcp d6 --terse | cut -d " " -f 4`
#falls man es augeben will echo $mon_state
done
 
Das ist das Gleiche, nur andere Schreibweise.
 
  • Gefällt mir
Reaktionen: svkra1973
Zurück
Oben