Autostart mit nohup statt screen

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Autostart mit nohup statt screen

Beitrag von Richard » 10.11.2018 19:13:03

Halo,

ich habe auf meinem Raspberry Pi Telegram-Server laufen, den ich für simple Steuerungsaufgaben nutze. Ich sende eine Nachricht an mich selbst, die Nachricht wird über eine entsprechende Funktion des Servers an ein Shellscript weitergeleitet, der Inhalt der Nachricht ausgewertet und entsprechende Aktionen werden gestartet. Obwohl es auf der Entwicklerseite ein HowTo für den Betrieb als Daemon gibt, läuft das leider nicht. Der Entwickler scheint schon länger nicht mehr an dem Programm zu machen. Ich lasse das Programm in einer Screen-Session starten per Cron:

Code: Alles auswählen

@reboot sleep 15 && screen -dmS TelegramCLI /home/pi/bin/telegram-cli/bin/telegram-cli -s /home/pi/bin/telegram-cli/actions.lua -k /home/pi/bin/telegram-cli/tg-server.pub > /dev/null
Das hat den Nachteil, dass ich schon versehentlich die Screen-Session beendet habe und wenn nur eine weitere läuft ich nicht einfach per 'screen -r' in diese springen kann (das geht nur, wenn genau EINE Screen-Session läuft). Ich habe daher versucht 'nohub' statt Screen zu nutzen. Das hier im Cron geht nicht:

Code: Alles auswählen

@reboot sleep 15 && nohup /home/pi/bin/telegram-cli/bin/telegram-cli -s /home/pi/bin/telegram-cli/actions.lua -k /home/pi/bin/telegram-cli/tg-server.pub > /dev/null
Ich finde per ps aux | grep keine Telegram-Instanz.

Was muss ich machen, damit es mit nohup geht? Gibt es eine andere Möglichkeit den Server im Hintergrund zu starten ohne Screen? Oder kann ich die Screen-Instanz irgendwie verstecken oder "schützen" (so dass ich sie nicht versehentlich beende und wieder einfach mit screen -r in eine andere Screen-Session wechseln kann)?

KP97
Beiträge: 3403
Registriert: 01.02.2013 15:07:36

Re: Autostart mit nohup statt screen

Beitrag von KP97 » 11.11.2018 15:16:31

Du kannst es bestimmt auch mit einer systemd Unit realisieren.
Ich würde mir einen ähnlichen Service suchen, den für meine Zwecke ändern und darin meine Befehle unterbringen.
Diese Units können ja alles Mögliche beim Start im Hintergrund ausführen, ganz bestimmt auch Deinen Telegram-Server.

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Autostart mit nohup statt screen

Beitrag von Richard » 11.11.2018 17:50:04

Ich bin jetzt erstmal auf tmux gewechselt.

Kann ich überhaupt den Server ohne Daemon im Hintergrund laufen lassen? Wozu haben dann manche Programm auch einen Daemon dabei?

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Autostart mit nohup statt screen

Beitrag von Richard » 12.11.2018 08:02:50

Komisch finde ich aber, dass mir ps jetzt 3 Telegram-Instanzen anzeigt, bei Screen waren es nur 2.

Die Instanz die ps selbst ist nicht mitgerechnet.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Autostart mit nohup statt screen

Beitrag von MSfree » 12.11.2018 08:25:20

Richard hat geschrieben: ↑ zum Beitrag ↑
11.11.2018 17:50:04
Kann ich überhaupt den Server ohne Daemon im Hintergrund laufen lassen?
Ja, das geht seit der Umstellung auf systemd. Mit dem alten SysVInit ging das nur über den Umweg screen/tmux.

Wenn du das jetzt immer noch mit screen/tmux machst, ist das eigentlich von hinten durch die Brust ins Auge.
Wozu haben dann manche Programm auch einen Daemon dabei?
Die Programme haben keinen Daemon "dabei". Sie führen intern einen fork() (siehe man 2 fork) aus, und gehen damit selbst in den Hintergrund. Die Gründe dafür sind vielfältig, so kann der erste Daemon z.B. selbst wiederum Children forken, diese kontrollieren, und auf Abstürze seiner Children reagieren, indem er diese neu startet.

uname
Beiträge: 12046
Registriert: 03.06.2008 09:33:02

Re: Autostart mit nohup statt screen

Beitrag von uname » 12.11.2018 08:35:21

Richard hat geschrieben:Komisch finde ich aber, dass mir ps jetzt 3 Telegram-Instanzen anzeigt, bei Screen waren es nur 2.
Was sagt

Code: Alles auswählen

pstree -p

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Autostart mit nohup statt screen

Beitrag von Richard » 12.11.2018 08:48:13

Ich hatte auf sie schnelle keine andere Lösung. Systemd ist für mich weiterhin ein Mysterium, manchmal geht es, manchmal nicht und oft weiß ich nicht wieso - in beiden Fällen.

pstree bringt

Code: Alles auswählen

pstree -p | grep telegram
           |-tmux: server(1220)---sh(1221)---telegram-cli(1223)

pferdefreund
Beiträge: 3791
Registriert: 26.02.2009 14:35:56

Re: Autostart mit nohup statt screen

Beitrag von pferdefreund » 12.11.2018 13:16:17

gcc -o wiesheissensoll derquelltextunten.c tuts. Braucht nix besonderes und funktioniert bei mir schon seit Jahren....
Ist kein schöner code aber macht, was er soll. Das System... könnte man ggf. noch durch exec... ersetzen.

Code: Alles auswählen

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
// aenderung am 01.03.2013
// automatisches ergaenzen &
int rc;
char cmdtab[20][256];
char cmd[1024];
int itab;
int pid;
int cmdlength;
void nonewline(char *cmd);
int main(int argc, char *argv[]) {
if (argc > 20) {
rc = 1;
printf("Zu viele Argumente\n");
exit (rc);
}
if (argc < 2) {
rc = 1;
printf("Bitte Programm mit Parametern eingeben, dass als\n");
printf("Hintergrundprozess laufen soll\n");
exit(rc);
}
strcpy(cmd,"");
itab = 1;
while (itab < argc) {
strcat(cmd,argv[itab]);
nonewline(cmd);
strcat(cmd," ");
itab = itab + 1;
}
printf(cmd);
cmdlength=strlen(cmd);
/* - 2, weil weiter oben noch */
/* ein space angehaengt wird  */
cmdlength=cmdlength - 2;
if (cmd[cmdlength] ==  '&') {
printf("& schon vorhanden - nix zu tun");
}
else {
strcat(cmd," &");
printf("%s%s","Cmd changed:",cmd);
}
printf("\n");
pid = fork();
if (pid > 0) {
printf("\n");
return 0;
} 
rc = system(cmd);
return rc;
}
#include <string.h>
/* entsorgen new-line-character am Zeilenende */
void nonewline(char *line)
{
int laenge;
laenge = strlen(line) - 1;
if (line[laenge] == '\n')
{
line[laenge] = 0;
}
return;
}



Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Autostart mit nohup statt screen

Beitrag von Richard » 12.11.2018 13:46:13

Wofür ist das? Für den Telegram-Daemon?

pferdefreund
Beiträge: 3791
Registriert: 26.02.2009 14:35:56

Re: Autostart mit nohup statt screen

Beitrag von pferdefreund » 13.11.2018 09:42:42

das kompilat ergibt ein Programm, dass man dazu verwenden kann, einen Prozess im Hintergrund zu starten.
Aufruf dann programm "daswaslaufensoll -parameter1 parameter2...."
Ich verwende das sehr gerne in der shell innerhalb einer grafischen Umgebung umd andere Programme wie browser, editor usw zu starten ohne dass ich immer wieder ein neues xterm oder so aufmachen muss. Progamm in der shell eintippen geht halt viel flotter, wie in Menues suchen. Das Ding ist primitiv - ein echter C-Programmierer wird sich sogar die Haare raufen - aber es funktioniert. Gibt halt unter Linux keinen S/370 Assembler usw wo man mit attach ... usw arbeiten könnte um eine subtask oder sowas zu starten.

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Autostart mit nohup statt screen

Beitrag von Richard » 13.11.2018 14:05:44

Dürfte es nicht reichen den mit 1> /dev/null und 2>/dev/null alles umzuleiten?

pferdefreund
Beiträge: 3791
Registriert: 26.02.2009 14:35:56

Re: Autostart mit nohup statt screen

Beitrag von pferdefreund » 13.11.2018 19:46:35

Nein, mit Beenden der Shell wurd das Programm beendet. Deshalb habe ich mir das ja geschriebem. Es gibt glaube ich mittlerweile offiziell ein daemonize, was das auch kann. Mal Paketsuche bemühen.

Antworten