выйти из ssh, но команда все еще работает? [дубликат]

(пространство пользователя) потоки не реализованы как процессы как таковые в Linux, поскольку у них нет собственного частного адресного пространства, они по-прежнему совместно используют адресное пространство родительского процесса.

Тем не менее, эти потоки реализованы для использования системы учета процессов ядра, поэтому им назначается собственный идентификатор потока (TID), но им присваивается тот же PID и «идентификатор группы потоков» (TGID), что и у родительского процесса. в отличие от форка, где создаются новые TGID и PID, а TID совпадает с PID.

Похоже, что в последних ядрах был отдельный TID, который можно запрашивать, именно он отличается для потоков, подходящий фрагмент кода, чтобы показать это в каждой из функций main() thread_function() выше:

    long tid = syscall(SYS_gettid);
    printf("%ld\n", tid);

Таким образом, весь код с этим будет следующим:

#include <pthread.h>                                                                                                                                          
#include <stdio.h>                                                                                                                                            
#include <unistd.h>                                                                                                                                           
#include <syscall.h>                                                                                                                                          

void* thread_function (void* arg)                                                                                                                             
{                                                                                                                                                             
    long tid = syscall(SYS_gettid);                                                                                                                           
    printf("child thread TID is %ld\n", tid);                                                                                                                 
    fprintf (stderr, "child thread pid is %d\n", (int) getpid ());                                                                                            
    /* Spin forever. */                                                                                                                                       
    while (1);                                                                                                                                                
    return NULL;                                                                                                                                              
}                                                                                                                                                             

int main ()                                                                                                                                                   
{                                                                                                                                               
    pthread_t thread;                                                                               
    long tid = syscall(SYS_gettid);     
    printf("main TID is %ld\n", tid);                                                                                             
    fprintf (stderr, "main thread pid is %d\n", (int) getpid ());                                                    
    pthread_create (&thread, NULL, &thread_function, NULL);                                           
    /* Spin forever. */                                                                                                                                       
    while (1);                                                                                                                                                
    return 0;                                                                                                                                                 
} 

Пример вывода:

main TID is 17963
main thread pid is 17963
thread TID is 17964
child thread pid is 17963
0
26.05.2017, 01:43
2 ответа

Когда лидер сеанса со связанным управляющим терминалом (bash, в ваш случай) завершается, операционная система отправляет SIGHUP всем процессам в группе процессов переднего плана (задание переднего плана). Кроме того, bash по умолчанию отправляет SIGHUP всем своим заданиям, работающим или остановленным (остановленные задания также отправляются SIGCONT). Теперь действие по умолчанию при получении SIGHUP — завершение процесса.

Существует несколько подходов к запуску процесса после выхода из bash. Во-первых, вы можете сделать свой процесс невосприимчивым к SIGHUP; это то, что делает команда nohup.Во-вторых, вы можете фонировать соответствующую группу процессов и указать bash не отправлять ей SIGHUP; это то, для чего используется встроенная оболочка disown (обратите внимание, что существует опция оболочки huponexit, которая вызывает отправку SIGHUP всем заданиям при выходе из интерактивной оболочки входа в систему).

Если вы хотите снова подключить терминал к группе процессов после повторного входа в систему, вы можете использовать оболочку, способную на это; терминальные мультиплексоры, такие как экран , имеют эту функцию.

3
28.01.2020, 02:15

Одним из решений является добавление к команде префикса nohup. Это говорит компьютеру игнорировать сигналы «зависания» (, такие как выход из сеанса ssh ). Это МОЖЕТ НЕ РАБОТАТЬ с петлями for.

Другим хорошим решением (и моим любимым способом сделать это )является установка пакета screen. screenпредоставляет виртуальный терминал, от которого можно отключиться, оставив процессы запущенными, нажав CTRL + A, D. Затем к экрану можно снова подключиться с помощью screen -r.

3
28.01.2020, 02:15

Теги

Похожие вопросы