Programm nur einmal Starten unter Linux
-
- Beiträge: 390
- Registriert: 30.08.2004 09:05
- Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64 - Wohnort: Heidelberg
Programm nur einmal Starten unter Linux
Hi,
ich weiß ich hab den Code mal hier im Forum gesehen.
Mit dem man abfragen kann ob ein Programm schon einmal gestartet wurde oder nicht.
Ich habe jetzt ca. eine Stunde gesucht mit der Forum Suche.
Unter Windows hab ich ja eine menge gefunden.
Nur nützt mir der Code nichts unter Linux.
Da der Code WinApi nutzt.
Gibt es da nicht auch ne Linux Möglichkeit?
ich weiß ich hab den Code mal hier im Forum gesehen.
Mit dem man abfragen kann ob ein Programm schon einmal gestartet wurde oder nicht.
Ich habe jetzt ca. eine Stunde gesucht mit der Forum Suche.
Unter Windows hab ich ja eine menge gefunden.
Nur nützt mir der Code nichts unter Linux.
Da der Code WinApi nutzt.
Gibt es da nicht auch ne Linux Möglichkeit?
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Re: Programm nur einmal Starten unter Linux
Hab etwas gesucht mit Google und fand mehrmals die Antwort,
dass man sowas über sockets macht. Anstatt das nun mit den
C-Funktionen zu machen habe ich einfach PBs Netzwerk-Funktionen
verwendet:
Funzt
Kannst sogar noch mit der ersten Instanz kommunizieren!
Ansonsten, erstelle ein File im TempDir dass du dann beim Beenden wieder
löschst (was bei einem Crash natürlich schwierig ist).
Oder suche in der Prozessliste nach einem Prozess mit deinem Namen.
Oder verwende Unix-Pipes (nochmals umständlicher).
greetz
Remi
dass man sowas über sockets macht. Anstatt das nun mit den
C-Funktionen zu machen habe ich einfach PBs Netzwerk-Funktionen
verwendet:
Code: Alles auswählen
InitNetwork()
port = 51665
If CreateNetworkServer(0, port)
Debug "first"
Repeat
Delay(1000)
ForEver
Else
Debug "second"
EndIf

Kannst sogar noch mit der ersten Instanz kommunizieren!
Ansonsten, erstelle ein File im TempDir dass du dann beim Beenden wieder
löschst (was bei einem Crash natürlich schwierig ist).
Oder suche in der Prozessliste nach einem Prozess mit deinem Namen.
Oder verwende Unix-Pipes (nochmals umständlicher).
greetz
Remi
-
- Beiträge: 390
- Registriert: 30.08.2004 09:05
- Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64 - Wohnort: Heidelberg
Re: Programm nur einmal Starten unter Linux
Mich unterhalten will ich eigentlich nicht mit dem Programm 
Es geht mir hier auch um speed.
Das Programm soll bestimmte aufgaben ausführen.
Alle 2 Minuten über Cron gestartet.
Falls es mal länger braucht...was momentan noch der Fall ist.
Arbeite aber dran es schneller hin zu bekommen.
Soll das Programm nicht noch mal gestartet werden.
Damit sie sich nicht behindern.
Ich werde das mal versuchen.
Danke für die Antwort

Es geht mir hier auch um speed.
Das Programm soll bestimmte aufgaben ausführen.
Alle 2 Minuten über Cron gestartet.
Falls es mal länger braucht...was momentan noch der Fall ist.
Arbeite aber dran es schneller hin zu bekommen.
Soll das Programm nicht noch mal gestartet werden.
Damit sie sich nicht behindern.
Ich werde das mal versuchen.
Danke für die Antwort

Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Re: Programm nur einmal Starten unter Linux
unter windows funktioniert das mit dem code von RSbasic. ich habe hier mal eine sehr abgespeckte version davon:
ich kenne mich in linux nicht aus, aber wenn es einen pb mutext gibt, der auch unter linux funktioniert, dann gibt es vieleicht auch einen linux eigenen mutex, mit dem du das windows beispiel umsetzen kanns.
Code: Alles auswählen
hMutex = CreateMutex_(0, #False, "DeineEindeutigeKennung")
If (GetLastError_() = #ERROR_ALREADY_EXISTS)
End
EndIf
-
- Beiträge: 390
- Registriert: 30.08.2004 09:05
- Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64 - Wohnort: Heidelberg
Re: Programm nur einmal Starten unter Linux
Du meinst das hier:
http://www.ibm.com/developerworks/syste ... linux.html
Win32
http://www.ibm.com/developerworks/syste ... linux.html
Win32
- CreateMutex(0, FALSE, 0)
CloseHandle(mutex)
WaitForSingleObject(mutex, INFINITE))
ReleaseMutex(mutex)
- pthread_mutex_init(&mutex, NULL))
pthread_mutex_destroy(&mutex)
pthread_mutex_lock(&mutex)
pthread_mutex_unlock(&mutex)
Zuletzt geändert von Andreas21 am 06.02.2010 13:44, insgesamt 1-mal geändert.
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Re: Programm nur einmal Starten unter Linux
das wichtigste ist, dass du einen mutex mit deiner eigenen kennung erzeugen kannst. so wie in pb, wo dir ein mutexhandle geliefert wird, nützt dir das leider nichts. ich glaube in dem beispiel von dir, wird auch automatisch ein mutex zugewiesen 
kannst du mit &mutex beim init einen eigenen wert setzen oder dient der nur als rückgabewert?

kannst du mit &mutex beim init einen eigenen wert setzen oder dient der nur als rückgabewert?
-
- Beiträge: 390
- Registriert: 30.08.2004 09:05
- Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64 - Wohnort: Heidelberg
Re: Programm nur einmal Starten unter Linux
Das geht leider nicht
Hätte das aber noch.
Nur keine ahnung wie ich die benutzen kann....
http://www.opengroup.org/pubs/online/79 ... _init.html

Hätte das aber noch.
Nur keine ahnung wie ich die benutzen kann....
http://www.opengroup.org/pubs/online/79 ... _init.html
Code: Alles auswählen
int sem_close(sem_t *);
int sem_destroy(sem_t *);
int sem_getvalue(sem_t *, int *);
int sem_init(sem_t *, int, unsigned int);
sem_t *sem_open(const char *, int, ...);
int sem_post(sem_t *);
int sem_trywait(sem_t *);
int sem_unlink(const char *);
int sem_wait(sem_t *);
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Re: Programm nur einmal Starten unter Linux

Ich sag dir, nimm die sockets! Wenn du sowas wie die Semaphores
nimmst, gibt es keine Möglichkeit sicherzustellen, dass du die
Semaphore auch wieder frei gibst.
Code: Alles auswählen
ImportC ""
sem_open(name.p-ascii, oflag.l, mode.l, value.l)
sem_close(sem)
sem_unlink(name.p-ascii)
EndImport
#O_CREAT= 0100
#O_EXCL= 0200
name.s = "/lolzmysemaphore"
sem = sem_open(name, #O_CREAT|#O_EXCL, %0110000000, 0)
Debug sem
sem_close(sem)
sem_unlink(name)
sem_close+sem_unlink, dann nämlich kann er die Semaphore
nie mehr erhalten, bis jemand frecherweise mal wieder
sem_unlink(name) aufruft, aber wer entscheidet schon, ob er
das darf?
greetz
remi
edit:kleiner Fehler beim Namen der Semaphore behoben
Zuletzt geändert von remi_meier am 08.02.2010 18:29, insgesamt 1-mal geändert.
-
- Beiträge: 390
- Registriert: 30.08.2004 09:05
- Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64 - Wohnort: Heidelberg
Re: Programm nur einmal Starten unter Linux
Ich habs jetzt mit sockets zwar gemacht.
Nur mit Mustex währ mir lieber gewesen....
Schade das es nicht so wie unter Windows möglich ist ohne gefahr zu lauffen das sem_unlink nicht ausgeführt wird......
sem_close ist nicht das Problem.
sem_unlink ist das Problem.
Wenn das Programm mit Kill beendet wird kann man das doch hiermit abfragen.
http://forums.purebasic.com/german/view ... 21&t=21290
Und wenn kill kommt dann den sem frei geben.
Und bei Errors kann man da nicht das über die Error funktion machen?
Bei einem Reboot müste der Sem ja auch frei gegeben werden oder?
Nur mit Mustex währ mir lieber gewesen....
Schade das es nicht so wie unter Windows möglich ist ohne gefahr zu lauffen das sem_unlink nicht ausgeführt wird......
sem_close ist nicht das Problem.
sem_unlink ist das Problem.
Wenn das Programm mit Kill beendet wird kann man das doch hiermit abfragen.
http://forums.purebasic.com/german/view ... 21&t=21290
Und wenn kill kommt dann den sem frei geben.
Und bei Errors kann man da nicht das über die Error funktion machen?
Bei einem Reboot müste der Sem ja auch frei gegeben werden oder?
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Re: Programm nur einmal Starten unter Linux
Das Problem, was du übrigens auch am Ende deines Links lesenAndreas21 hat geschrieben: Wenn das Programm mit Kill beendet wird kann man das doch hiermit abfragen.
http://forums.purebasic.com/german/view ... 21&t=21290
Und wenn kill kommt dann den sem frei geben.
Und bei Errors kann man da nicht das über die Error funktion machen?
Bei einem Reboot müste der Sem ja auch frei gegeben werden oder?
kannst, ist das Signal SIGKILL. SIGTERM und alle weiteren kannst
du so mit der OnError-Lib abfangen, aber SIGKILL nicht (kannst
du übrigens mit "killall -9 meinprog" testen).
Wenn dir das SIGKILL egal ist (was übrigens auch vom OOM_Killer
gesendet wird), kannst du das ruhig so versuchen.
Und:
Was du machen könntest wäre, wenn die Semaphore schon existiert,POSIX named semaphores have kernel persistence: if not removed by
sem_unlink(3), a semaphore will exist until the system is shut down.
Kontakt mit dem Programm aufzunehmen (über ein File, named Pipe
oder Sockets

irgendwie feststellen, ob das Programm noch lebt. Diese Funktionalität
hat man bei den Sockets automatisch. Wenn du den Port noch einstell-
bar machst, gibt es doch kaum Probleme.
greetz
Remi