Démoniser les processus sous Linux

Processus et concepts périphériques

TTY (terminal virtuel) | -Session | -Groupe de processus | -Processus

"TTY = session 1> N processus groupe 1> N processus"

L'un des processus est un chef de session, et plusieurs d'entre eux sont des chefs de groupe de processus.

session

Une session de connexion associée à TTY. Il s'agit d'un groupe d'un ou plusieurs groupes de processus, et le processus qui devient le chef de session a le rôle d'interagir avec le terminal de contrôle et de terminer tous les processus enfants lorsque le terminal est déconnecté. Les groupes de processus ne peuvent être créés que dans la session à laquelle ils appartiennent.

Groupe de processus

Un ensemble de processus qui peuvent envoyer des signaux à d'autres processus. Les membres ont l'ID de processus du chef de groupe de processus comme ID de groupe. Appelez setpgid () ou setsid () pour devenir le leader d'un groupe de processus.

fork() L'appel de cette fonction duplique le processus. Si la valeur de retour est 0, elle est traitée par le processus enfant et si la valeur de retour est égale ou supérieure à 0, elle est traitée par le processus parent. Les deux procèdent simultanément avec le même code source. Par conséquent, il est nécessaire de créer une branche avec une instruction if et d'écrire deux codes source pour le processus parent et le processus enfant.

la mise en oeuvre

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>

#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <sysexits.h>
#include <unistd.h>
#include <syslog.h>

#define MAXFD 64

int demonize(int chdir_flg){

    int i = 0;
    int fd = 0;
    pid_t pid = 0;


    //------------------------------------------------------
    //Statut.
    //Processus parent au démarrage du programme(shell)Avoir et avoir un ATS.
    //------------------------------------------------------
    
    
    //------------------------------------------------------
    //Créer un processus enfant pour détacher le parent et renvoyer le contrôle au shell.
    //------------------------------------------------------
    if((pid = fork()) == -1){

        return -1;

    //Le processus parent se termine après la création du processus enfant.
    }else if(pid != 0){

        //N'appelez pas les fonctions de nettoyage définies par l'utilisateur_exit()je fais.
        _exit(0);
    }
    
    
    //------------------------------------------------------
    //Statut.
    //Seuls les processus enfants, mais TTY est conservé.
    //------------------------------------------------------
    

    //------------------------------------------------------
    //Séparer TTY pour devenir un chef de session et un chef de groupe de processus.
    //------------------------------------------------------
    setsid();
    

    //------------------------------------------------------
    //Ignorer le signal HUP.
    //Parce que les signaux HUP peuvent être envoyés à l'enfant lorsque le parent meurt.
    //------------------------------------------------------
    signal(SIGHUP, SIG_IGN);
    

    //------------------------------------------------------
    //Statut.
    //Puisqu'il s'agit d'un leader de session à ce rythme, si vous ouvrez un TTY, ce TTY sera associé..
    //------------------------------------------------------
    
    
    //------------------------------------------------------
    //Processus parent(Chef de groupe de session)Débrancher.
    //Devenir un leader sans parent, sans TTY et sans session.
    //------------------------------------------------------
    if((pid = fork()) == 0){
        //Fin du processus enfant.
        _exit(0);
    }
    


    //------------------------------------------------------
    //Préparez-vous à courir en démon.
    //------------------------------------------------------

    //Changer le répertoire courant.
    if(chdir_flg == 0){
        
        //Déplacer vers le répertoire racine.
        chdir("/");
    }
    

        
    //Fermer tous les descripteurs de fichiers hérités du parent.
    for(i = 0; i < MAXFD; i++){
        close(i);
    }
        
    // stdin,stdout,dev stderr/Ouvrir avec null.
    //Si vous fermez simplement le descripteur, ces sorties entraîneront une erreur, donc dev/Rediriger vers null.
    if((fd = open("/dev/null", O_RDWR, 0) != -1)){
        
        //Dupliquer le descripteur de fichier.
        //0 de ce processus,1,Dev a pointé 2 par fd/Pointez sur null.
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        if(fd < 2){
            close(fd);
        }
    }
    
    return (0);

}

int main(int argc, const char * argv[]) {

    char buf[256];
    demonize(1);
    
    //Afficher le répertoire actuel.
    syslog(LOG_USER | LOG_NOTICE, "demon:cwd=%s¥n", getcwd(buf, sizeof(buf)));
    
    return 0;
}

Il peut être transformé en démon simplement en appelant demontrez () avec la fonction main (). Si vous écrivez une commande pour démarrer un programme démonisé dans "/etc/rc.local", vous pouvez le démarrer en arrière-plan au démarrage du serveur.

référence

["Linux Network Programming Bible"](http://www.amazon.co.jp/Linux Network Programming Bible-Mitsuyuki Omata-ebook / dp / B00O8GIL62 / ref = sr_1_1? Ie = UTF8 & qid = 1429337305 & sr = 8-1 & keywords = linux + bible de programmation réseau) Scyphus Draft - Comment créer un démon

Recommended Posts

Démoniser les processus sous Linux
jblas sur Arch Linux
Linux (WSL) sous Windows
Routeur NAT sur Linux
Développer .NET sur Linux
Wake on LAN sous Linux
Surveiller le trafic sous Linux
Mettre à jour vscode sur Linux
Créer LiveUSB sur Linux
Fonctionnement Linux sur Win10
Mémo de configuration NTP sous Linux
Installer Linux sur Chromebox
Rétrograder Mcomix avec Arch Linux
À propos des fichiers et des processus LINUX
Surveiller l'utilisation du disque sous Linux
Utiliser Github Desktop sous Linux
Installez JDK sur Linux
Elixir = à l'aise avec Linux Mint
Enregistrement et lecture sous Linux
Vérification TTL avec un routeur Linux
Lire la tension du noyau sous Linux
Mettez jenv dans Amazon Linux
Commande df facile sur Linux
Linux sur Windows -1-: Présentation de Debian
Installez tomcat 5.5 sur Amazon Linux.
Présentation d'Elixir à Linux Mint
Installation de Homebrew sur Amazon Linux 2
Collez le lien sous Linux
Construction de l'environnement Linux (sur environnement WSL)
Utiliser Linux sur Windows 10 (WSL2)
Configurer OpenSSH dans Arch Linux
Utilisez host.docker.internal sur Linux (docker-compose requis)
Installez Python Pillow sur Amazon Linux
Copie facile dans le presse-papier sous Linux
Installer Oracle Java8 sur Amazon Linux2
Essayez d'installer OpenAM sur Amazon Linux
Installez Arch Linux sur DeskMini A300
Achèvement de la commande docker sous Linux
Exécutez un serveur Linux avec GCP
Comment installer VMware-Tools sur Linux
Afficher l'utilisation du disque sur Linux personnel
Extraire des CD de musique sur Arch Linux
Créer un environnement Linux sur Windows 10
Linux
[Linux] Construction de l'environnement Docker sur Redhat
[Note] Installez Imagick sur Amzon Linux2
[Note] Exécutez Django sur Amazon Linux 2
Présentation de l'environnement Python 3.5.2 sur Amazon Linux