Moin moin....
Ich weiß ich kann mit meinen Fragen nerven....
Hab jetzt auch schon mehrere Stunden damit verbracht via Google und Stackoverflow ne lösung zu finden...
Einige ansätze waren ja schon gut.. aber haben nie wirklich zum erfolg gefürht...
So was will ich?
Ich hab ein Programm laufen, das mehrere Screen-Sessions startet und selbst auch in einer Screensession läuft (gestartet werden sollte...)
Soweit ja auch ganz ok....
Jetzt kann es aber auch mal passieren, das das Programm abstürtzt oder der Benutzer dummerweise mit strg+c das Programm beendet.
Oder das Programm selber hat nicht ordentlich einen Screen Prozess beim "Herunterfahren" gestoppt...
Wie dem auch sei...
Wenn das Programm neu gestartet wird, möchte ich eine Funktion einbauen, die prüft ob noch alte Prozesse am leben sind....
Ein weiteres Problem an der Sache ist....
Ich weiß nicht wie der Benutzer seine Screen-Sessions nennt... Also muss erstmal eine PID abfrage nach allen Screen-Sessions laufen..... und dann alle pids bist auf getpid() (also die eigene PID) mit einem kill -9 killen...
Die Pids würde ich dazu gerne in einem int Vector speichern und dann eben über alle einträge iterieren...
Mein Konkretes Problem ist jetzt.... Wie bekomme ich jetzt die PID's der entsprechenden Prozesse heraus..
getpid() gibt mir ja nur die eigene Pid zurück... und die will ich ja am leben halten...
mit system("pgrep screen") bekomme ich zwar die Pids alle einmal ausgegeben, kann sie aber nicht einzeln in einen vector einlesen.
Die Möglichkeit das ganze in eine Datei umzuleiten und dann die einzelnen Zeilen einlesen würde ich gern vermeiden.
Gibts noch weitere Möglichkeiten?
[EDIT]
Aktuell hab ich es so:
Wie gesagt.. die methode mit erst in eine Datei speicher, dann aus der Datei lesen... dann die pids killen und dann die datei löschen.... find ich bisschen umständlich....
Ich weiß ich kann mit meinen Fragen nerven....
Hab jetzt auch schon mehrere Stunden damit verbracht via Google und Stackoverflow ne lösung zu finden...
Einige ansätze waren ja schon gut.. aber haben nie wirklich zum erfolg gefürht...
So was will ich?
Ich hab ein Programm laufen, das mehrere Screen-Sessions startet und selbst auch in einer Screensession läuft (gestartet werden sollte...)
Soweit ja auch ganz ok....
Jetzt kann es aber auch mal passieren, das das Programm abstürtzt oder der Benutzer dummerweise mit strg+c das Programm beendet.
Oder das Programm selber hat nicht ordentlich einen Screen Prozess beim "Herunterfahren" gestoppt...
Wie dem auch sei...
Wenn das Programm neu gestartet wird, möchte ich eine Funktion einbauen, die prüft ob noch alte Prozesse am leben sind....
Ein weiteres Problem an der Sache ist....
Ich weiß nicht wie der Benutzer seine Screen-Sessions nennt... Also muss erstmal eine PID abfrage nach allen Screen-Sessions laufen..... und dann alle pids bist auf getpid() (also die eigene PID) mit einem kill -9 killen...
Die Pids würde ich dazu gerne in einem int Vector speichern und dann eben über alle einträge iterieren...
Mein Konkretes Problem ist jetzt.... Wie bekomme ich jetzt die PID's der entsprechenden Prozesse heraus..
getpid() gibt mir ja nur die eigene Pid zurück... und die will ich ja am leben halten...
mit system("pgrep screen") bekomme ich zwar die Pids alle einmal ausgegeben, kann sie aber nicht einzeln in einen vector einlesen.
Die Möglichkeit das ganze in eine Datei umzuleiten und dann die einzelnen Zeilen einlesen würde ich gern vermeiden.
Gibts noch weitere Möglichkeiten?
[EDIT]
Aktuell hab ich es so:
Code:
#include <iostream>
#include <string>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <fstream>
bool isRunning() {
std::string command = "pgrep screen > pids.txt";
//system(command.c_str());
return 0 == system(command.c_str());
}
void pidToVector(std::vector<std::string>* p) {
std::ifstream f ("pids.txt");
for( std::string line; getline( f, line ); )
{
p->push_back(line);
}
}
int main() {
std::vector<std::string> pid;
if (isRunning()){
std::cout << "Some running processes found. Kill'em'All" << std::endl;
pidToVector(&pid);
} else {
std::cout << "no pids found" << std::endl;
}
for(unsigned int i = 0; i < pid.size(); i++) {
std::cout << pid[i] << std::endl;
if(stoi(pid[i]) != getpid()) {
std::string command = "kill -9 " + pid[i] + "&& screen -wipe > /dev/null";
system(command.c_str());
std::cout << "Kill ProcessID " << pid[i] << std::endl;
}
}
system("rm -rf pids.txt");
}
Zuletzt bearbeitet: