Как убить зомби-процессы?

У меня есть две проблемы: программа, которую я сделал, сбивает с толку и делает почти неубиваемые процессы, если любая из подзадач решена, я считаю, что обе проблемы будут легко решены. Я запускаю Macbook начала 2008 года на OSX 10.6.8.

/Задача № 1, кодировка:/

Я играл с iRobot Create, используя termios.h I/O. Я компилирую без предупреждений и ошибок и могу запустить программу без проблем. Я подключаюсь к роботу через usb, который объясняет ввод "/dev/tty.usbserial".

 gcc simple.c -o simple
 ./simple /dev/tty.usbserial

Программа начинается с проверки заданных аргументов, затем пытается соединиться с заданным аргументом (char * device is /dev/tty.usbserial) с функцией biscConnect(). Это не на моем Mac.

//in file simple.c:
int main(int argc, char *argv[]){
if(argc!=2){
    printf("Put port... like /dev/tty.usbserial or something\n");
    exit(EXIT_FAILURE);
}
printf("Starting...\n");
biscConnect(argv[1]);
}
void biscConnect(char *device){
struct termios tty;

// Try to open the device from the input
    if((fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK))==-1){
        fprintf(stderr, "Serial port at %s could not be opened: %s\n", device, strerror(errno));
        exit(EXIT_FAILURE);
    }
     tcflush (fd, TCIOFLUSH);
     tcgetattr(fd, &tty);
     tty.c_iflag     = IGNBRK | IGNPAR;
     tty.c_lflag     = 0;
     tty.c_oflag     = 0;
     tty.c_cflag     = CREAD | CS8 | CLOCAL;
     cfsetispeed(&tty, B57600);
     cfsetospeed(&tty, B57600);
     tcsetattr(fd, TCSANOW, &tty);

     //The code fails prior to this point
}

Затем я посылаю байты роботу, чтобы он двигался, если он не застрял до этого.

/Проблема №2, неубиваемые процессы:/ Когда я запускаю файл, терминал переходит в странный режим, когда подсказка исчезает, и я могу напечатать все, что захочу (обычно это означает, что процесс запущен). Я не могу выйти, используя control-c. Единственный способ, которым я могу выйти, это закрыть окно терминала. Это не может убить запущенный процесс.

Я могу легко найти pid, но монитор активности, но принудительное завершение не может завершить процесс, kill -9 [pid] завершается неудачно, killall [имя программы] завершается ошибкой и т. Д., Несмотря на признание существования программы. Кажется, что единственный способ принудительно завершить процесс - это физически отключить питание компьютера и перезагрузить его (т. Е. Отключение не работает, потому что он пытается и не может завершить процесс (ы)). Я трачу ужасное количество времени, если для отладки программы мне нужно включать и выключать ноутбук каждый раз! Я могу постоянно создавать больше процессов, но не могу их удалить.

Я думаю, что если бы я знал родительский процесс, я мог бы убить эти "зомби" процессы, но я не знаю, что такое родительский процесс.

Любые идеи о том, как избавиться от этих процессов без выключения и включения питания, будут огромной помощью, спасибо!

2 ответа

Решение

На Mac OS X 10.8.4 я создал программу zombie от zombie.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    pid_t pid;

    if ((pid = fork()) >= 0)
    {
        if (pid == 0)
        {
            printf("%d: committing suicide (parent %d)\n", (int)getpid(), (int)getppid());
            exit(0);
        }
        else
        {
            printf("%d: going to sleep for a while - child %d might die while I snooze\n",
                (int)getpid(), (int)pid);
            sleep(30);
            printf("%d: awake\n", (int)getpid());
        }
    }
    return 0;
}

Когда я запустил его в одном окне терминала, вывод был:

$ ./zombie
2443: going to sleep for a while - child 2444 might die while I snooze
2444: committing suicide (parent 2443)
2443: awake
$

В другом окне терминала работает ps -f произведено:

  UID   PID  PPID   C STIME   TTY           TIME CMD
  503   260   249   0 12:42PM ttys004    0:00.08 -bash
  503  2443   260   0  5:11PM ttys004    0:00.00 ./zombie
  503  2444  2443   0  5:11PM ttys004    0:00.00 (zombie)

Скобки (zombie) это несуществующий процесс, а имя в скобках - это оригинальное имя процесса. Когда я скопировал программу в living-dead, соответствующий вывод был:

  UID   PID  PPID   C STIME   TTY           TIME CMD
  503   260   249   0 12:42PM ttys004    0:00.09 -bash
  503  2454   260   0  5:13PM ttys004    0:00.00 ./living-dead
  503  2455  2454   0  5:13PM ttys004    0:00.00 (living-dead)

(В большинстве систем несуществующий процесс помечается как <defunct> или что-то подобное.)

Очевидно, что значение в PPID столбец идентифицирует родительский процесс зомби, а различные идентификаторы процессов соответствуют выходным данным самих программ.

Вы можете узнать, кто породил этот процесс нежити, запустив ps ef или используя htop,

PID   TTY      STAT   TIME COMMAND
21138 tty1     T      0:00 sudo /usr/bin/aura -Akax open_watcom openwatcom-extras-hg HOME=/home/hav3lock USER=hav3lock SHELL=/bin/zsh TERM=linux PATH=/usr/local/sbin:/u
21139 tty1     T      0:00  \_ /usr/bin/aura -Akax open_watcom openwatcom-extras-hg TERM=linux PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/
22111 tty1     Z      0:00      \_ [su] <defunct>`

В приведенном выше у меня есть процесс зомби, мама которого / usr / bin / aura, процесс, созданный sudo / usr / bin / aura.

Бег sudo kill -9 21138 убьет родителя, тем самым впоследствии убив его икру зомби.

PID   TTY      STAT   TIME COMMAND
23858 pts/9    S+     0:00 sudo sudo ps ef LANG=en_US.utf8 DISPLAY=:0 SHLVL=3 LOGNAME=hav3lock XDG_VTNR=1 PWD=/home/hav3lock/sy.l/repos/pub_rel/slen/linux/src HG=/usr/b
23860 pts/9    S+     0:00  \_ sudo ps ef LANG=en_US.utf8 DISPLAY=:0 LS_COLORS=no=0:fi=0:di=34:ln=00;96:or=91;4:mi=00;31;9:mh=01;37:pi=33;7:so=01;35:do=35:bd=01;33:cd=9
23861 pts/9    R+     0:00      \_ ps ef LANG=en_US.utf8 DISPLAY=:0 LS_COLORS=no=0:fi=0:di=34:ln=00;96:or=91;4:mi=00;31;9:mh=01;37:pi=33;7:so=01;35:do=35:bd=01;33:cd=93
13405 tty2     S<sl+   3:49 X :0 HOME=/home/hav3lock USER=hav3lock SHELL=/bin/zsh TERM=linux PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/ve`
Другие вопросы по тегам