Hi all I made a very small patch to the SysRq facility that signals a program with SIGUSR1, the program is registered via sysctl The signal is launched with Alt+SysRq+X (X stands for eXecute program) /proc/sys/kernel/sysrq_progid contains pid and start_time which totally identifies the program to signal One of the uses of this is restore the console when a X-server or a SVGAlib program crashes How many times did you have got to reboot because of that, while your system may be doing something important??? this hopefully solves the problem Patch is included below, sample programs/scripts are available at http://pusa.uv.es/~ulisses/sysrq_X.tar.gz Comments/sugestions wanted, please e-mail me directly to [EMAIL PROTECTED] (I'm not subscribed to the linux-kernel mailing list) Bye! Ulisses ----------------------------------------------------------------------------- Debian GNU/Linux: a dream come true ----------------------------------------------------------------------------- diff -u -r linux-2.4.0-test8/drivers/char/sysrq.c linux-2.4.0-test8-modificat2/drivers/char/sysrq.c --- linux-2.4.0-test8/drivers/char/sysrq.c Tue Aug 1 04:36:10 2000 +++ linux-2.4.0-test8-modificat2/drivers/char/sysrq.c Mon Sep 25 08:58:23 2000 @@ -6,6 +6,8 @@ * * (c) 1997 Martin Mares <[EMAIL PROTECTED]> * based on ideas by Pavel Machek <[EMAIL PROTECTED]> + * + * (c) 2000 Ulisses Alonso Camaró eXecute_program extension */ #include <linux/config.h> @@ -22,6 +24,7 @@ #include <linux/quotaops.h> #include <linux/smp_lock.h> #include <linux/module.h> +#include <linux/kernel.h> #include <asm/ptrace.h> @@ -30,9 +33,13 @@ extern int console_loglevel; extern struct list_head super_blocks; +void signal_program(void); + /* Whether we react on sysrq keys or just ignore them */ int sysrq_enabled = 1; +unsigned long sysrq_progid[2]= {0, 0}; /* pid and start_time */ + /* Machine specific power off function */ void (*sysrq_power_off)(void) = NULL; @@ -53,6 +60,35 @@ } } +void signal_program(void) +{ + struct task_struct *p; + pid_t pid= (pid_t)sysrq_progid[0]; + + read_lock(&tasklist_lock); + + if ((p= find_task_by_pid(pid)) == NULL) + goto error; + + if (!p->mm || p->pid == 1) + goto error; + + if (p->start_time != sysrq_progid[1]) + goto error; + + send_sig(SIGUSR1, p, 0); + + read_unlock(&tasklist_lock); + + return; + + error: + printk(KERN_ERR "SysRq: Could not send signal to pid %d with start_time +%lu\n", + pid, sysrq_progid[1]); + + return; +} + /* * This function is called by the keyboard handler when SysRq is pressed * and any other keycode arrives. @@ -138,6 +174,10 @@ send_sig_all(SIGKILL, 1); orig_log_level = 8; break; + case 'x': + printk("eXecute program\n"); + signal_program(); + break; default: /* Unknown: help */ if (kbd) printk("unRaw "); @@ -148,7 +188,7 @@ printk("Boot "); if (sysrq_power_off) printk("Off "); - printk("Sync Unmount showPc showTasks showMem loglevel0-8 tErm kIll killalL\n"); + printk("Sync Unmount showPc showTasks showMem loglevel0-8 tErm kIll +killalL eXec_program\n"); /* Don't use 'A' as it's handled specially on the Sparc */ } diff -u -r linux-2.4.0-test8/include/linux/sysctl.h linux-2.4.0-test8-modificat2/include/linux/sysctl.h --- linux-2.4.0-test8/include/linux/sysctl.h Thu Aug 10 22:01:26 2000 +++ linux-2.4.0-test8-modificat2/include/linux/sysctl.h Sun Sep 24 12:39:30 2000 @@ -113,6 +113,7 @@ KERN_OVERFLOWGID=47, /* int: overflow GID */ KERN_SHMPATH=48, /* string: path to shm fs */ KERN_HOTPLUG=49, /* string: path to hotplug policy agent */ + KERN_SYSRQ_PROGID=50 /* string: pid and start_time of the program to signal +*/ }; diff -u -r linux-2.4.0-test8/kernel/sysctl.c linux-2.4.0-test8-modificat2/kernel/sysctl.c --- linux-2.4.0-test8/kernel/sysctl.c Tue Aug 1 04:36:11 2000 +++ linux-2.4.0-test8-modificat2/kernel/sysctl.c Mon Sep 25 08:59:24 2000 @@ -83,6 +83,10 @@ extern int acct_parm[]; #endif +#ifdef CONFIG_MAGIC_SYSRQ +extern unsigned long sysrq_progid[]; +#endif + extern int pgt_cache_water[]; static int parse_table(int *, int, void *, size_t *, void *, size_t, @@ -220,6 +224,10 @@ #ifdef CONFIG_MAGIC_SYSRQ {KERN_SYSRQ, "sysrq", &sysrq_enabled, sizeof (int), 0644, NULL, &proc_dointvec}, + {KERN_SYSRQ_PROGID, "sysrq_progid", &sysrq_progid, 2*sizeof(unsigned long), + 0644, NULL, &proc_doulongvec_minmax, NULL, + (void *)NULL, (void *)NULL}, +/* (void *)&sysrq_progid_min, (void *)&sysrq_progid_max}, */ #endif {KERN_MAX_THREADS, "threads-max", &max_threads, sizeof(int), 0644, NULL, &proc_dointvec}, - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] Please read the FAQ at http://www.tux.org/lkml/