Programm nur einmal Starten unter Linux

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Andreas21
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

Beitrag von Andreas21 »

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?
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Re: Programm nur einmal Starten unter Linux

Beitrag von remi_meier »

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:

Code: Alles auswählen

InitNetwork()

port = 51665
If CreateNetworkServer(0, port)
  Debug "first"
  Repeat
    Delay(1000)
  ForEver
Else
  Debug "second"
EndIf
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
Andreas21
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

Beitrag von Andreas21 »

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 ;)
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Programm nur einmal Starten unter Linux

Beitrag von Josh »

unter windows funktioniert das mit dem code von RSbasic. ich habe hier mal eine sehr abgespeckte version davon:

Code: Alles auswählen

  hMutex = CreateMutex_(0, #False, "DeineEindeutigeKennung")
  If (GetLastError_() = #ERROR_ALREADY_EXISTS)
    End
  EndIf
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.
Andreas21
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

Beitrag von Andreas21 »

Du meinst das hier:
http://www.ibm.com/developerworks/syste ... linux.html

Win32
  • CreateMutex(0, FALSE, 0)
    CloseHandle(mutex)
    WaitForSingleObject(mutex, INFINITE))
    ReleaseMutex(mutex)
Linux
  • pthread_mutex_init(&mutex, NULL))
    pthread_mutex_destroy(&mutex)
    pthread_mutex_lock(&mutex)
    pthread_mutex_unlock(&mutex)
Ich werd das mal kurz testen^^
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
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Programm nur einmal Starten unter Linux

Beitrag von Josh »

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?
Andreas21
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

Beitrag von Andreas21 »

Das geht leider nicht :cry:

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
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Re: Programm nur einmal Starten unter Linux

Beitrag von remi_meier »

:?
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)
Der Code funktioniert, ausser du killst das Programm vor dem
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.
Andreas21
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

Beitrag von Andreas21 »

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?
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Re: Programm nur einmal Starten unter Linux

Beitrag von remi_meier »

Andreas21 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?
Das Problem, was du übrigens auch am Ende deines Links lesen
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:
POSIX named semaphores have kernel persistence: if not removed by
sem_unlink(3), a semaphore will exist until the system is shut down.
Was du machen könntest wäre, wenn die Semaphore schon existiert,
Kontakt mit dem Programm aufzunehmen (über ein File, named Pipe
oder Sockets :lol: ) und versuchen zu kommunizieren. Also einfach
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
Antworten