Как убить зомби-процессы?
У меня есть две проблемы: программа, которую я сделал, сбивает с толку и делает почти неубиваемые процессы, если любая из подзадач решена, я считаю, что обе проблемы будут легко решены. Я запускаю 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`