killall.c revision 27cec9ac4ca6c207ea7e74e109e362659f8dfeeb
17aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley/* killall.c - Send signal (default: TERM) to all processes with given names. 2ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley * 3ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley * Copyright 2012 Andreas Heck <aheck@gmx.de> 4ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley * 5f91b7c89bc852868692b9518185421ebb52d67b3Rob Landley * http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/killall.html 6ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 7ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De BrauwerUSE_KILLALL(NEWTOY(killall, "<1?lqvi", TOYFLAG_USR|TOYFLAG_BIN)) 8ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 9ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyconfig KILLALL 107aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley bool "killall" 117aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley default y 127aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley help 1327cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley usage: killall [-l] [-iqv] [-SIG] PROCESS_NAME... 14ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 157aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley Send a signal (default: TERM) to all processes with the given names. 16ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 17ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer -i ask for confirmation before killing 1827cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley -l print list of all available signals 197aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley -q don't print any warnings or error messages 2027cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley -v report if the signal was successfully sent 21ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley*/ 22ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 23c0e56edaf256adb6c60c5a052525a1ffbb927901Rob Landley#define FOR_killall 24ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley#include "toys.h" 25ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 26c0e56edaf256adb6c60c5a052525a1ffbb927901Rob LandleyGLOBALS( 277aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley int signum; 2841b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer pid_t cur_pid; 29ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley) 30ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 31ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwerstatic int kill_process(pid_t pid, char *name) 32f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley{ 337aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley int ret; 34ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 3541b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer if (pid == TT.cur_pid) return 1; 3641b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer 3727cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley if (toys.optflags & FLAG_i) { 3827cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley sprintf(toybuf, "Signal %s(%d) ?", name, pid); 39ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer if (yesno(toybuf, 0) == 0) return 1; 40ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer } 41ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer 427aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley toys.exitval = 0; 43ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer 447aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley ret = kill(pid, TT.signum); 45ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer if (toys.optflags & FLAG_v) 46ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer printf("Killed %s(%d) with signal %d\n", name, pid, TT.signum); 47ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 487aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (ret == -1 && !(toys.optflags & FLAG_q)) perror("kill"); 497c6209d6c336df74984e62aa88679c06641ae309Elie De Brauwer return 1; 50ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley} 51ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 52ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyvoid killall_main(void) 53ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley{ 5427cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley char **names = toys.optargs; 55ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 567aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley TT.signum = SIGTERM; 577aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley toys.exitval++; 584696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley 5927cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley if (toys.optflags & FLAG_l) { 6027cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley sig_to_num(NULL); 6127cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley return; 627aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 63ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 647aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (**names == '-') { 657aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (0 > (TT.signum = sig_to_num((*names)+1))) { 667aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (toys.optflags & FLAG_q) exit(1); 677aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley error_exit("Invalid signal"); 687aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 697aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley names++; 7027cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley } 71ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 7227cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley if (!*names) { 7327cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley toys.exithelp++; 7427cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley error_exit("Process name missing!"); 757aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 76ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 7741b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer TT.cur_pid = getpid(); 7841b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer 797aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley for_each_pid_with_name_in(names, kill_process); 80ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 817aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (toys.exitval && !(toys.optflags & FLAG_q)) error_exit("No such process"); 82ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley} 83