Seite 2 von 3

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 16.05.2015 15:27
von derschutzhund
Hallo Nic..

mein kleines Progrämmchen ist soweit fertig und tut was es soll!
Neben dem Programm verwende ich noch ein paar kleine scripte:
- getprozesse -> ruft ps auf und erzeugt die Datei laufende.txt die Liste der aktiven Prozesse
- unload_all_mntd_sfs -> entfernt alle überflüssigen sfs aus dem Speicher

Hier mal das Programm "prozesscontroller.pb":

Code: Alles auswählen

EnableExplicit
 
IncludeFile "prozesscontroller.pbf"
 
Define event, EventGadget, EventType, EventMenu, EventWindow, prglauf
Global erster.i, prozessbeendet.i, gefunden.i, teilstr$, neuerstr$
Global NewList neueprozesse.s()     
Global NewList alteprozesse.s()     

OpenWindow_0()

erster = 0
AddWindowTimer(Window_0, 123, 30000)

; ----- hier etwas das sofort beim Start erledigt werden soll eintragen
 
Repeat
  Event = WaitWindowEvent()
  EventGadget = EventGadget()
  EventType = EventType()
  EventMenu = EventMenu()
  EventWindow = EventWindow()
  
  If Event = #PB_Event_Timer And EventTimer() = 123
     analyse(event)
   EndIf 
  prglauf=Window_0_Events(Event)
Until prglauf=#False
End
 
;-------- ab hier die Proceduren für Buttons, etc. -----------------
 
Procedure beenden(Event)
  End
EndProcedure

Procedure analyse(event)
  Define hilf$, hilfstr$
  hilf$ = GetCurrentDirectory()+"getprozesse"
  RunProgram(hilf$)   ; erzeugt die Datei "laufende.txt"
  ClearGadgetItems(editor_0)
  ClearList(neueprozesse())
  
  #DATEI_REPORT = 1
  If ReadFile(#DATEI_REPORT, GetCurrentDirectory()+"laufende.txt")                               
    While Eof(#DATEI_REPORT) = #False
      
      hilfstr$ = ReadString(#DATEI_REPORT)       
      If Mid(hilfstr$,23,1) = "/"
        If FindString(hilfstr$,"/bin/busybox init") = 0
          If FindString(hilfstr$,"/sbin/udevd") = 0
            If FindString(hilfstr$,"/sbin/getty") = 0
              If FindString(hilfstr$,"/usr/bin/xinit") = 0
                If FindString(hilfstr$,"/usr/local/apps/ROX-Filer/ROX-Filer") = 0
                  If FindString(hilfstr$,"/usr/local/pup_event/pup_event_frontend_d") = 0
                    If FindString(hilfstr$,"/usr/sbin/cupsd") = 0
                      If FindString(hilfstr$,"/usr/bin/dbus-daemon") = 0
                        If FindString(hilfstr$,"/usr/local/firewallstate") = 0
                          If FindString(hilfstr$,"/usr/lib/i386-linux-gnu/gconf") = 0
                            AddGadgetItem(editor_0,-1,hilfstr$)
                            AddElement(neueprozesse())
                            neueprozesse() = hilfstr$
                          EndIf  
                        EndIf
                      EndIf
                    EndIf
                  EndIf
                EndIf
              EndIf
            EndIf  
          EndIf
        EndIf
      EndIf
    Wend
    CloseFile(#DATEI_REPORT)
  EndIf
  
  prozessbeendet = 0
  If erster = 0                  ; wenn es der erste Durchlauf ist
    ForEach(neueprozesse())
      AddElement(alteprozesse())
      alteprozesse() = Mid(neueprozesse(),23)
    Next  
    erster = 1
  Else
    ForEach(alteprozesse())    ; pruefen ob ein alter Prozess in der neuen Liste fehlt
      gefunden = 0
      teilstr$ = alteprozesse()
      ForEach(neueprozesse())
        neuerstr$ = neueprozesse()
        If FindString(neuerstr$,teilstr$) > 0
          gefunden = 1
        EndIf  
      Next  
      If gefunden = 0
        prozessbeendet = 1
      EndIf  
    Next
    ClearList(alteprozesse())
    ForEach(neueprozesse())
      AddElement(alteprozesse())
      alteprozesse() = Mid(neueprozesse(),23)
    Next  
    
  EndIf  
  If prozessbeendet = 1
    RunProgram("/usr/sbin/ceelab/lazy-sfs-unload/unload_all_mntd_sfs")
  EndIf  
EndProcedure
------------------------------------------------
und hier die Form dazu:

Code: Alles auswählen

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Global Window_0

Global Button_0, Button_1, Editor_0

Enumeration FormFont
  #Font_Window_0_0
EndEnumeration

LoadFont(#Font_Window_0_0,"Droid Sans Mono", 10)

Declare ResizeGadgetsWindow_0()

Declare beenden(EventType)
Declare analyse(EventType)

Procedure OpenWindow_0(x = 0, y = 0, width = 710, height = 230)
  Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
  Button_0 = ButtonGadget(#PB_Any, 340, 200, 230, 25, "Programm beenden")
  GadgetToolTip(Button_0, "Beendet die Prozessueberwachung")
  Button_1 = ButtonGadget(#PB_Any, 70, 200, 100, 25, "analyse")
  Editor_0 = EditorGadget(#PB_Any, 20, 20, 680, 170)
  SetGadgetFont(Editor_0, FontID(#Font_Window_0_0))
EndProcedure

Procedure ResizeGadgetsWindow_0()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(Window_0)
  FormWindowHeight = WindowHeight(Window_0)
  ResizeGadget(Button_0, 340, FormWindowHeight - 30, 230, 25)
  ResizeGadget(Button_1, 70, FormWindowHeight - 30, 100, 25)
  ResizeGadget(Editor_0, 20, 20, FormWindowWidth - 30, FormWindowHeight - 60)
EndProcedure

Procedure Window_0_Events(event)
  Select event
    Case #PB_Event_SizeWindow
      ResizeGadgetsWindow_0()
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_0
          beenden(EventType())          
        Case Button_1
          analyse(EventType())          
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure
Evtl. baue ich die Form wieder aus, da sie im normalen Betrieb eigentlich nicht gebraucht wird.
Werde ich mir noch überlegen.

Zwei Dinge sind mir noch aufgefallen:
1. Unter Linux kann ich kein icon ins Programm einbauen. Die Optionen unter "Projekt" ist deaktiviert.

2. Wie bekomme ich das executable als Icon ins System-Tray ohne, dass es unten in der Programmleiste als laufendes Programm angezeigt wird? Ein Kollege hat mal testweise etwas ähnliches mit C Programmiert und das wird nicht als Programm in der Liste unten angezeigt sondern hat ein kleines Symbol im System-Tray.

LG

Wolfgang

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 16.05.2015 15:53
von ts-soft

Code: Alles auswählen

gtk_window_set_icon_(WindowID(0), ImageID(0))
Gruß
Thomas

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 16.05.2015 18:47
von derschutzhund
Sollte es so gehen?

Code: Alles auswählen

EnableExplicit
 
UsePNGImageDecoder()

DataSection
 LINUXICON:
 IncludeBinary "/mnt/sda1/PureBasic/Prozesstimer/cnccheckerC.png"
EndDataSection

IncludeFile "prozesscontroller.pbf"
 
Define event, EventGadget, EventType, EventMenu, EventWindow, prglauf
Global erster.i, prozessbeendet.i, gefunden.i, teilstr$, neuerstr$, icon.i
Global NewList neueprozesse.s()     
Global NewList alteprozesse.s()     

OpenWindow_0()

icon = CatchImage(#PB_Any, ?LINUXICON)

gtk_window_set_icon_(WindowID(0), ImageID(icon))
Programm geht natürlich noch weiter...

Ein ICON wird leider nicht angezeigt.

LG

Wolfgang

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 16.05.2015 19:18
von ts-soft
Wenn WindowID(0) stimmt, sollte es gehen. Aber nicht jeder Windowmanager zeigt auch Icons an!

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 16.05.2015 19:51
von derschutzhund
ts-soft hat geschrieben:Wenn WindowID(0) stimmt, sollte es gehen. Aber nicht jeder Windowmanager zeigt auch Icons an!
WindowID(0) stimmt!

Ich nutzen als Windowmanager den JWM.

Schade, dass das mit Purebasic nicht geht!

LG

Wolfgang

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 16.05.2015 20:11
von ts-soft
Es geht schon, aber Dein Manger zeigt anscheinend keine Icons an, wie die meisten anderen auch. Evtl. siehst Du das Icon in der Startleiste o. ä., je nachdem was der nutzt.
Das hat aber auch rein garnichts mit PureBasic zu tun :wink:

Gruß
Thomas

PS: hab hier unter Ubuntu Mate auch nur 2 Themes wo das Programm-Icon im Fenster oben links angezeigt wird.

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 18.05.2015 10:26
von auser
NicTheQuick hat geschrieben: Es gibt fertige Programme, die das können und tatsächlich loggen, wann welche Prozesse gestartet wurden. Siehe auch hier: How can I log all process launches in Linux
Sieht man auch mit ps (ps -eo pid,lstart,cmd) oder halt wiederum im proc (awk '{print $22}' < /proc/$PID/stat). Auditd ist ziemlich nützlich wenn man rausfinden will warum z.B. auf mysteriöse Weise ein File immer wieder verschwindet aber (im Vergleich zu ps oder dem proc-fs) standardmässig oft nicht installiert und nicht immer ganz so trivial (verschiedene Systemcalls, HD voll, ...).

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 18.05.2015 14:15
von derschutzhund
Das hat aber auch rein garnichts mit PureBasic zu tun :wink:
Na ja, muss eigentlich schon, weil es bei anderen Binärdateien auch geht!
Ein kleines Progrämmchen 13Kb vom Kollegen wird als Minisymbol in der Taskleiste unten rechts in meinem Linux angezeigt!
Also geht es, aber halt mit PB nicht!

LG

Wolfgang

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 18.05.2015 14:30
von NicTheQuick
Das Thema geht jetzt etwas in die falsche Richtung. Zudem habe ich das Gefühl, dass derschutzhund vom SysTrayIcon redet und ts-soft vom Programm-Icon. Das sind zwei unterschiedliche Dinge.

Re: Liste der laufenden Prozesse / Programme ermitteln

Verfasst: 18.05.2015 14:51
von derschutzhund
Natürlich geht es um das System-Tray! Das steht auch im obersten Beitrag auf dieser Seite!
In den Optionen kann ich bei der Erzeugung der Binärdatei einstellen ob es normal sichtbar oder unsichtbar sein soll aber ich finde nicht etwas zum System-Tray!
Wenn ich es unsichtbar schalte dann kann ich es halt nicht mehr abschalten was nicht so schön ist.
Hab ich da vielleicht was übersehen?

EDIT: Habe gerade gesehen, dass es sogar ein Example zu dem Thema gibt "systray.pb".
Damit experimentiere ich jetzt mal etwas, aber das Beispiel sieht so aus wie ich es haben will.
Jetzt muss es nur noch mit meinem eigenen Programm laufen!

LG

Wolfgang