LJ Archive

UpFront

Tech Tip

Don Marti

Issue #179, March 2009

Running Complex Commands with sudo

If you use sudo to run commands as root, you've probably run into “permission denied” problems when only part of a pipeline or part of a command is running with root permissions.

This fails with “permission denied” because the file is writable only by root:

$ echo 12000 > /proc/sys/vm/dirty_writeback_centisecs

But, this fails too:

$ sudo echo 12000 > /proc/sys/vm/dirty_writeback_centisecs

Why? The /bin/echo program is running as root, because of sudo, but the shell that's redirecting echo's output to the root-only file is still running as you. Your current shell does the redirection before sudo starts.

The solution is to run the whole pipeline under sudo. There are a couple ways to do it, but I prefer:

echo "echo 12000 > /proc/sys/vm/dirty_writeback_centisecs" | sudo sh

That way, I can type everything before the pipe character, and see what I'm about to run as root, then press the up arrow and add the | sudo sh to do it for real. This is not a big deal for short, obvious pipelines, but when you're building up a more complicated command as root, it's safer to look at it first before you run it.

Tech Tip

Chilaka Ravi Kumar

Issue #179, March 2009

Watch Live Interrupts

To see the interrupts occurring on your system, run the command:

# watch -n1 "cat /proc/interrupts"

       CPU0       CPU1
 0:        330          0   IO-APIC-edge      timer
 1:      11336          0   IO-APIC-edge      i8042
 4:          2          0   IO-APIC-edge
 6:          3          0   IO-APIC-edge      floppy
 ...
NMI:          0          0   Non-maskable interrupts
LOC:    5806923    6239132   Local timer interrupts
 ...

The -n1 option passed to watch causes the specified command to be re-run every second.

LJ Archive