How to stop other processes and kernel from printing output on current virtual term

Hello All,

Background

I am creating a virtual appliance console for a software stack on VMware ESXi. I am using Centos 5.x as the Linux distro (Guest OS). I have created a ncurses based application that does the user authentication and present him with some basic controls to do basic system administration. This application will be setup to lunch automatically from mingetty as it is happening now. We have made the configuration to launch the application on tty1 automatically after each system restart.

The Issue

The issue which is hindering us alot are the kernel and other processes outputs that get printed on tty1 when it is active. Well it is a normal behavior that all kernel info, warnings and error messages are goes to the current active virtual console. But this also destroy our ncurses based application UI that supposed to run all the time on the tty1.

The Question

So my question is that can we in Linux (kernel:2.6, distro:Centos5.x) stop kernel and other processes to output their text to our terminal (i.e. tty1), and also redirect all the output to tty1 except ours to some other VC such as tty2.

Kindly respond anyone. We are in deep trouble due to this issue.
Thanks

Kashif Ali Siddiqui
Linux Developer

This is not a programming solution:

  1. edit your /etc/syslog.conf file to turn off all of the syslog messages that display there. This does not stop other kernel output.

  2. For that you can play with klogd errorlevel settings. Start klogd with something like

klogd -c 4

This limits console displays to severe errors only. KERN_ERR level messages I believe.
Read your man page for klogd and syslog before tinkering. DO NOT GO ANY LOWER.

Both of these suggestions have downsides - they shut off the flow of information which a lot of sysadmins find useful. They also require a custom setup script if this is a product that goes to customers who are not Linux savvy.

Kindly suggest how can I restrict kernel and other utilities that generate logs entries through klogd and syslog to a specific (fixed) virtual terminal.

Since /dev/tty1 will be hosting my application, I can open up /dev/tty2 to have all system wide log entries there. So is there any thing in kernel arguments, and/or in configuration that I can change/make to restrict all kernel output to a specific console.

Also I post this in programming forum, because in my application, I explicitly made the STDOUT(/dev/tty1) exclusive to my application, and redirect all the output to the /dev/tty2. Here is the code ...


bool TerminalSetup()
{
	bool bRet = false;
	
	if (ioctl(1, TIOCEXCL, 0) != 0)
	{
		printf("\n -- Error!!\nUnable to put the terminal into exclusive mode.. ");
	}
	
	int iFd = 0;	
        string ref_strRedirTerminal = "/dev/tty2";
	if ((iFd = open(ref_strRedirTerminal.c_str(), O_RDWR)) == -1) /* strange ... */
	{
		fprintf(stderr, "Could not open %s R/W (%s)\n", ref_strRedirTerminal.c_str(), strerror(errno));
		fflush(stderr);
		return false;		/* maybe above user limit? */
	}
	
	if (ioctl(iFd, TIOCCONS, 0))
	{
		fprintf(stderr, "Terminal redirection fails. (%s)\n", strerror(errno));
		fflush(stderr);		
	}
		
	close(iFd);
	
	bRet = true;	
	return bRet;
}

So what I get in result is that when I redirected an output to /dev/tty1 through echo as

echo "Testing ..." > /dev/tty1 

the output did redirected to the /dev/tty2 as I made it explicit in my code. But when partition tables are re-synced from fdisk utility, the kernel outputs on the /dev/tty1 (as it was active then).

Hence the above code to make /dev/tty1 exclusive to my process, and redirect all output to /dev/tty2 fails partially.

So any thoughts then.

Kashif