You are currently browsing the tag archive for the ‘Linux’ tag.
I spent the evening compiling mysql 5.1.37 on Fedora 8. I had no trouble compiling on RHEL4 but on Fedora 8 I ran configure
-fno-exceptions -fno-rtti" ./configure \
--enable-assembler \
--with-mysqld-ldflags="-all-static" \
--with-client-ldflags="-all-static"
followed by make
and was getting compile errors
libtool: link: gcc -O3 -felide-constructors -fno-exceptions -fno-rtti -fno-implicit-templates -fno-exceptions -fno-rtti -rdynamic -o mysql mysql.o readline.o sql_string.o completion_hash.o -static ../cmd-line-utils/libedit/libedit.a -lncursesw -lpthread ../libmysql/.libs/libmysqlclient.a -lcrypt -lnsl -lm -lz
/usr/bin/ld: cannot find -lncursesw
collect2: ld returned 1 exit status
make[1]: *** [mysql] Error 1
make[1]: Leaving directory `/home/crashingdaily/mysql-5.1.37/client'
make: *** [all] Error 2
This was resolved by installing the static ncurses libs via the ncurses-static package.
That then left me with the compile failure (showing only part of the error)
term.c:(.text+0x1557): undefined reference to `tputs'
term.c:(.text+0x1580): undefined reference to `tgetstr'
term.c:(.text+0x1676): undefined reference to `tgoto'
term.c:(.text+0x169a): undefined reference to `tputs'
term.c:(.text+0x1761): undefined reference to `tgoto'
term.c:(.text+0x1781): undefined reference to `tputs'
This was resolved by adding -ltinfo
to the client ldflags in the configure
options
-fno-exceptions -fno-rtti" ./configure \
--enable-assembler \
--with-mysqld-ldflags="-all-static" \
--with-client-ldflags="-all-static -ltinfo"
Now make
completed successfully. Lovely.
I recently re-discovered autossh. I’ve been using it to persist mounted sshfs volumes but am only just now realizing it’s the scratch for some of my other itches.
With it I can
autossh -M50000 -t -D1080 -Nf crashingdaily.com
to keep a seemingly persistent SOCKS proxy running.
Or
autossh -M50000 -t crashingdaily.com 'screen -aAdR autossh'
to maintain an interactive session.
The value that I missed earlier is that the connections are maintained (re-established, actually) even if I change networks – which my laptop and I often do.
Jon’s View has a nice posting on using autossh for SOCKS proxying.
And Dread Pirate PJ has a good instruction for combining autossh and screen for persistent interactive sessions.
autossh is available for OS X via Darwin Ports and Fink and for Linux as source code or as binary packages from repositories for most modern Linux distributions.
The at
command can be used in CGI scripts to remotely trigger non-recurring jobs on a web server. This is especially useful for long running jobs that clients don’t need to wait on and jobs that need to persist across web daemon restarts.
My initial simple attempts to schedule a job with at
in a CGI script executed by an Apache webserver were met with the failure response “This account is currently not available
“. That message being the output of /sbin/nologin
which is the shell value set for the apache
user in /etc/password
.
The fix is to set the SHELL environment variable to a proper shell when executing at
. Here’s a simple, proof-of-concept CGI script.
use CGI;
my $cgi = new CGI;
print $cgi->header;
system(‘echo “/usr/bin/env > /tmp/apacheenv” | SHELL=/bin/bash at now’);
Calling the CGI script triggers the at
scheduling. In this case, the execution of /usr/bin/env
is immediate and successful.
SERVER_SIGNATURE=
SHELL=/bin/bash
HTTP_USER_AGENT=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/528.18.1 (KHTML, like Gecko) Version/4.0 Safari/528.17
SERVER_PORT=80
Related:
Here is a brief look at the Linux commands, type
and hash
.
To start, I open a new terminal and check for the location of the foo
executable using the which
command. (foo
is a trivial shell script I concocted for illustrative examples in this posting.)
$ which foo /usr/local/bin/foo
which
tells me the location of the executable file in my $PATH
but that is not necessarily what will be executed when I call foo
on the command line. To learn that, I use the type
command.
$ type foo foo is /usr/local/bin/foo
type
reports how a word will be interpreted if used as command name. In this case, it is telling me that using foo
as a command will execute the file /usr/local/bin/foo
. That happens to be what which
also reported, but, as we will see in the following examples, that will not always be the case.
I can run the foo
command to print its release version.
$ foo --version foo release 1.0
Consider if I install a new foo, version 2.0, in my ~/bin
directory, leaving the 1.0 version in /usr/local/bin/foo
. I have positioned ~/bin
ahead of /usr/local/bin
in my $PATH
and the which
command confirms the new 2.0 version is found first.
$ which foo /home/crashingdaily/bin/foo
However, when I call for foo
to be executed it still executes the old 1.0 version.
$ foo --version foo release 1.0
Hmm, what’s going on? The which
command reported the first executable found in my path but type
will be more informative. It will tell us precisely what file, function, builtin, keyword or alias is associated with a given command name.
$ type foo foo is hashed (/usr/local/bin/foo)
This is reporting that the shell has saved the meaning of foo
in a hash table as /usr/local/bin/foo
(the 1.0 version). Caching the command in a hash table is an optimization that saves the shell from having to search $PATH every time. A given shell does this the first time a command is run in that shell instance. The hashed values survive for the life of the shell instance. Start a new shell, e.g. by opening a new terminal or invoking a subshell, and you start a new hash table for that shell process.
The hash table can also be manually manipulated to clear or set values. Enter the hash
command. This command is used to print and edit the shell’s command hash table.
The entire hash table can be cleared
$ hash -r
or you can delete a specific entry
$ hash -d foo
Having cleared the hash table, invoking foo
now calls the first in my path.
$ foo --version foo release 2.0
And this copy is now placed in the hash table.
$ type foo foo is hashed (/home/crashingdaily/foo)
I can also print that entry of the hash table to get its value. However, do not use this as a substitute for type
as it only deals with files. More on that shortly.
$ hash -t foo /home/crashingdaily/foo
As you might imagine, if I delete the executable whose value has been hashed,
$ rm /home/crashingdaily/foo
the command is not found when I attempt to use it,
$ foo --version -bash: /home/crashingdaily/bin/foo: No such file or directory
until I update the hash. I can clear the hash as before or I can explictly set the value like so
$ hash -p /usr/local/bin/foo foo
$ type foo foo is hashed (/usr/local/bin/foo)
$ foo --version foo release 1.0
Keep in mind that the hash table caches (and the hash
command reports) file and path names. It does not deal with keywords, functions, builtins or aliases which may be invoked by a command name. So, type
is the utility to use for learning what will execute when a command name is invoked.
To further illustrate type
usage, I will define a function named foo
.
$ function foo { echo 'hello world'; }
Because function names take precedence over file executables having the same name, invoking foo
executes the function instead of the shell script. Now, type
reports
$ type foo foo is a function foo () { echo 'hello world' }
and invoking the name gives us the expected function output.
$ foo hello world
Using type
with the -a
option reports all the known values of foo
$ type -a foo foo is a function foo () { echo 'hello world' } foo is /home/crashingdaily/bin/foo foo is /usr/local/bin/foo
In summary, use type
to learn what a given command name currently means to the shell – there could be more than one meaning. Use hash
to manipulate cached associations of command names with files (and be aware that the command name may be associated with a non-file that takes precedence).
Additional documentation for type
and hash
is availble via the help
command.
$ help type type: type [-afptP] name [name ...] For each NAME, indicate how it would be interpreted if used as a command name...
$ help hash hash: hash [-lr] [-p pathname] [-dt] [name ...] For each NAME, the full pathname of the command is determined and remembered....