On Aug 17, 2010, at 12:30 PM, Boyd Stephen Smith Jr. wrote: > In <84960162-4435-43b2-a07b-3361f8bda...@halblog.com>, Hal Vaughan wrote: >> 2) It will only run bash scripts. I tried putting a Perl script in that >> directory and it wouldn't work, so I had to put a bash script in that >> directory to run my Perl script. > > This seems wrong. Did your perl script have the correct "she-bang" line as > the first line of the file: #!/usr/bin/perl ? Did it have execute > permissions?
I agree, it seems wrong, but that was my experience. I did use the correct she-bang, I even copied that Perl script, as it was, into ~/bin, without changing it. However, the permissions for the scripts in /etc/dhcp3/dhclient-exit-hook.d are all "-rw-r--r--" and owned by root. I had checked to make sure my Perl script matched in ownership and permissions, still no go. Of course, when I put it in my ~/bin directory, I changed the ownership to my account and changed the permissions so it was a "normal" executable. And my bash script I replaced it with in /etc/dhcp3/dhclient-exit-hook.d matched in ownership and permissions to all the other files in that directory. > Like many parts of Debian, I'd expect this to be using run-parts or > equivalent, which simply makes a C/system call to "exec()". On Linux, exec() > handles ELF executables with the +x bit and text files with a "she-bang" line > and the +x bit. But dhclient-script, which is what is run on any event involving the interface, is a bash script, not a C program. I read that it's 255 (or was it 254) lines long when I scanned it in less. There's an exit_with_hooks() function it calls at the end. First it looks for the script /etc/dhcp3/dhclient-exit-hooks and if it exists, it runs it with the routine run_hook(). Then it looks for the directory /etc/dhcp3/dhclient-exit-hooks.d (which, apparently, from comments, is a Debian only thing) and calls run_hookdir() to run the scrips in that directory. For each script, it calls run_hook() to run it. Here's the routine run_hook(): run_hook() { local script="$1" local exit_status shift # discard the first argument, then the rest are the script's if [ -f $script ]; then . $script "$@" fi if [ -n "$exit_status" ] && [ "$exit_status" -ne 0 ]; then logger -p daemon.err "$script returned non-zero exit status $exit_status" save_exit_status=$exit_status fi return $exit_status } I'm not an expert on bash scripting, but if I remember right, the dot command is the same as "source" where, rather than running a script, it run the commands in the script. I could be wrong about that, but if that's the case, then it explains why it executes a bash script and not a Perl script. Hal -- To UNSUBSCRIBE, email to debian-user-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/c6ae9aba-68c4-4b94-8bb8-8c77ed2a9...@halblog.com