技术技巧

由 Staff 撰写
使 KPilot 在 Ubuntu 上工作

Ubuntu/Kubuntu Edgy Eft 版本自带的 KPilot 无法与许多 Palm 设备(如 Palm TX、许多 Treo 手机等)一起使用。 尽管许多人抱怨 USB 端口设置困难,但此技巧并未解决该特定问题。 即使您使 USB 端口正常工作(我使用网络同步,所以对我来说无关紧要),您也会遇到其他问题。 例如,在许多情况下,KPilot 会从您的 Palm 设备复制记录,但在该过程中会擦除 Palm 设备上的记录。

在撰写本文时,Ubuntu 的好人们尚未认为适合更新 KPilot。 但是,无需等待。 您可以下载最新的 KPilot,自行编译并安装。 我下载的版本与我的 Palm 设备配合良好。

您必须拥有 KDE 和 Qt 开发库才能编译 KPilot,因此您至少需要安装 kde-devel。 您还需要 cmake,Ubuntu 中默认未安装。 您还需要单独安装最新版本的 pilot-link,并首先编译它。 在此示例中,我将 pilot-link 安装在 /usr/local/src/pilot-link-0.12.1 中。 我还为我的平台设置了以下环境变量(这是可选的,可能不适用于您的平台)

export CFLAGS="-march=athlon64 -O2 -pipe"
export CXXFLAGS="${CFLAGS}"
export CPPFLAGS="${CFLAGS}"
export CXX="g++"

以下是下载、制作和安装 KPilot 的命令

cd /usr/local/src
svn co svn://anonsvn.kde.org/home/kde/branches/KDE/
↪3.5/kdepim/kpilot/
cd kpilot
./configure --prefix=/usr --with-pilot-link=/usr/
↪local/src/pilot-link-0.12.1
make -f Makefile.cmake
make -f Makefile.cmake install

如果您已经运行了 KPilot,则需要退出,甚至可能需要使用以下命令杀死守护进程

killall kpilotDaemon

重启 KPilot,现在您应该可以毫无问题地同步。 如果您想及时了解最新更改,可以使用以下命令更新源代码(显然,之后您需要再次配置和安装)

svn update kpilot

—尼古拉斯·彼得雷利

Linux watch 命令

许多 Linux 开源软件都具有良好的监控命令,用于观察进程活动。 其中一些命令没有图形用户界面,在其他情况下,管理员更喜欢使用命令行。 监控活动的进度是一项持续的任务。

Linux watch(1) 命令 ( linux.about.com/library/cmd/blcmdl1_watch.htm) 是一个用于监控进度的有用工具。 它允许用户运行命令并在终端窗口中观看输出。 它可以定期执行监控命令,并显示连续更新之间的差异(-d 选项)。

许多 Amanda ( amanda.zmanda.com) 用户,包括我自己,都使用 watch 命令来观察 Amanda 备份进度。 Amanda 状态命令 amstatus ( wiki.zmanda.com/index.php/amstatuscommand) 可以每分钟与 watch 命令一起运行,以监控正在备份的每个文件系统的进度

watch --differences=cumulative
 ↪--interval=60 amstatus backupconfigg

上面的命令监视 Amanda 配置 backconfig 的备份进度。

watch 的另一个用途是监视系统中的内存使用情况

watch cat /proc/meminfo

—帕迪·斯里尼瓦桑

PHP 创建密码脚本

以下技巧由 Nathan A. Good 和 Allan Kent 的 PEAR 基础:快速 PHP 开发 提供,由 Apress 出版 ( www.apress.com/book/bookDisplay.html?bID=10181)。

此技巧展示了如何使用名为 Text_Password 的 PEAR 包生成强密码。 要使用此技巧中显示的代码,您需要安装 PEAR 和 PHP,并且需要安装 Text_Password 包。 要安装 Text_Password 包,请输入

pear install text_password

代码

创建密码的 PHP 脚本如下所示

      
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Password Example</title>
<style>
    li {
        font-style: italic;
    }
</style>
</head>
<body>
<?php
// require the Text_Password package
// to be included in the page
require_once "Text/Password.php";
?>
<p>
<strong>Here is a pronounceable password, defaulting
        to 10 characters:</strong>
<br />
<em><?php echo Text_Password::create(); ?></em>
</p>
<p>
<strong>Here are 5 unpronounceable passwords, with
        a length of 15 characters each:</strong>
<br />
<ul>
<?php
    $passwords = Text_Password::createMultiple(5,
    15, 'unpronounceable');
    foreach ($passwords as $password) {
    ?>
    <li><?php echo $password; ?></li>
    <?php
    }
?>
</ul>
</p>
</body>
</html>

结果

执行脚本时,它会生成与此处所示非常相似的输出。 当然,由于密码是随机生成的,因此您的实际结果会略有不同

      
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Password Example</title>
<style>
    li {
        font-style: italic;
    }
</style>
</head>
<body>
<p>
<strong>Here is a pronounceable password, defaulting
  to 10 characters:</strong>
<br />
<em>vumaechoud</em>
</p>
<p>
<strong>Here are 5 unpronounceable passwords, with a
  length of 15 characters each:</strong>
<br />
<ul>
    <li>E_3uYlRxYY2n%pd</li>
        <li>Ghn0Q@XZr%DBvDe</li>
        <li>0tAUoGoJR7C1zo2</li>
        <li>f#EA5jHIZmjaW8O</li>
        <li>1cbc7fhL@d#RHWM</li>
    </ul>
</p>
</body>
</html>

工作原理

Text_Password::create() 方法可以静态调用。 它返回一个可发音的密码,默认长度为十个字符,如输出所示。

Text_Password::createMultiple() 方法也可以静态调用,它可以接受参数,让您指定要返回多少个密码、每个密码中的字符数以及它们是可发音的还是不可发音的,具体取决于密码所需的复杂性。 不可发音的密码包含数字和标点符号。

使用 Text_Password 包,您可以快速编写 PHP 脚本,使您的应用程序或网站具有生成密码的能力。

—内森·A·古德和艾伦·肯特

锁定文件

此技巧由 Linux Journal 专栏作家 Dave Taylor 和 No Starch Press 提供。

任何读取或附加到共享数据文件(如日志文件)的脚本都需要一种可靠的方式来锁定文件,以防止脚本的其他实例干扰更新。 想法是,单独的锁文件的存在充当信号量,指示另一个文件正忙且无法使用。 请求脚本等待并重试,希望文件能够相对及时地释放,这通过删除其锁文件来表示。

但是,锁文件很难使用,因为许多看似万无一失的解决方案都无法正常工作。 例如,以下是解决此问题的典型方法

while [ -f $lockfile ] ; do
  sleep 1
done
touch $lockfile

看起来应该可以工作,不是吗? 您循环直到锁文件不存在,然后创建它以确保您拥有锁文件,因此可以安全地修改基础文件。 如果另一个具有相同循环的脚本看到您的锁,它将旋转直到锁文件消失。 但是,这实际上不起作用,因为尽管看起来脚本在运行时不会被换出,而其他进程会轮流执行,但这实际上是不正确的。 想象一下,如果在这个循环中刚刚显示的 done 之后,但在 touch 之前,这个脚本被换出并放回处理器队列,而另一个脚本改为运行时会发生什么。 另一个脚本会忠实地测试锁文件,发现它丢失并创建自己的版本。 然后,队列中的脚本将换回并执行 touch,结果是两个脚本都会认为它们具有独占访问权,这很糟糕。

幸运的是,流行的 procmail 电子邮件过滤程序的作者 Stephen van den Berg 和 Philip Guenther 包含一个 lockfile 命令,该命令使您可以在 shell 脚本中安全可靠地使用锁文件。

许多 UNIX 发行版(包括 Linux 和 Mac OS X)都已安装 lockfile。 您可以通过键入以下内容来检查您的系统是否已安装 lockfileman 1 lockfile。 如果您得到一个 man 页面,那么您很幸运! 如果没有,请从 www.procmail.org 下载 procmail 包,并在您的系统上安装 lockfile 命令。 本节中的脚本假定您已安装 lockfile 命令。

代码

      
#!/bin/sh

# filelock - A flexible file-locking mechanism.

retries="10"            # default number of retries
action="lock"           # default action
nullcmd="/bin/true"     # null command for lockfile

while getopts "lur:" opt; do
  case $opt in
    l ) action="lock"      ;;
    u ) action="unlock"    ;;
    r ) retries="$OPTARG"  ;;
  esac
done
shift $(($OPTIND - 1))

if [ $# -eq 0 ] ; then
  cat << EOF >&2
Usage: $0 [-l|-u] [-r retries] lockfilename
Where -l requests a lock (the default), -u requests
an unlock, -r X specifies a maximum number of retries
before it fails (default = $retries).
EOF
  exit 1
fi

# Ascertain whether we have lockf or lockfile
# system apps

if [ -z "$(which lockfile | grep -v '^no ')" ] ; then
  echo "$0 failed: 'lockfile' utility not
  found in PATH." >&2
  exit 1
fi

if [ "$action" = "lock" ] ; then
  if ! lockfile -1 -r $retries "$1" 2> /dev/null;
    then echo "$0: Failed: Couldn't create
    lockfile in time" >&2
    exit 1
  fi
else    # action = unlock
  if [ ! -f "$1" ] ; then
    echo "$0: Warning: lockfile $1 doesn't
    exist to unlock" >&2
    exit 1
  fi
  rm -f "$1"
fi

exit 0

运行脚本

虽然 lockfile 脚本不是您通常会单独使用的脚本,但您可以尝试通过打开两个终端窗口来测试它。 要创建锁,只需将您要尝试锁定的文件的名称指定为 filelock 的参数。 要删除锁,请添加 -u 选项。

结果

首先,创建一个锁定的文件

$ filelock /tmp/exclusive.lck
$ ls -l /tmp/exclusive.lck
-r--r--r--  1 taylor  wheel  1 Mar 21 15:35
 ↪/tmp/exclusive.lck

第二次尝试锁定文件时,filelock 会尝试默认次数(十次),然后失败,如下所示

$ filelock /tmp/exclusive.lck
filelock : Failed: Couldn't create lockfile in time

当第一个进程完成文件操作后,您可以释放锁

$ filelock -u /tmp/exclusive.lck

要查看 filelock 脚本如何在两个终端中工作,请在一个窗口中运行 unlock 命令,而另一个窗口旋转尝试建立其自己的独占锁。

破解脚本

因为此脚本依赖于锁文件的存在来证明锁仍然有效,所以拥有一个额外的参数会很有用,例如,锁应该有效的最长时间。 如果锁文件例程超时,则可以检查锁定文件的上次访问时间,如果锁定文件比此参数的值旧,则可以安全地将其作为游离文件删除,可能带有警告消息,也可能没有。

这不太可能影响您,但 lockfile 不适用于 NFS 挂载的磁盘。 实际上,NFS 挂载磁盘上可靠的文件锁定机制非常复杂。 完全避免此问题的更好策略是在本地磁盘上创建锁文件。

经 No Starch Press 许可摘录自 Dave Taylor 的 Wicked Cool Shell Scripts:Linux、Mac OS X 和 UNIX 系统的 101 个脚本 一书 ( www.nostarch.com/wcss.htm)。

致谢
  • 帕迪·斯里尼瓦桑是 Zmanda 的工程副总裁兼联合创始人。

  • 内森·A·古德住在明尼苏达州双子城地区。 他是一名软件开发人员、系统管理员和作家。 他撰写或合著了多本关于开源技术的书籍和文章。

  • 艾伦·肯特出生于南非,并在开普敦生活和工作。 他已经在各种语言和不同平台上编程超过 20 年。 他目前是盛世长城开普敦分公司的技术主管。

  • Dave Taylor 是一位长期的 UNIX 和 Linux 爱好者,并运营着受欢迎的 www.AskDaveTaylor.com 技术支持博客。 他的著作 Wicked Cool Shell Scripts 可以在 www.intuitive.com/wicked 找到,完整的脚本库可以在 www.intuitive.com/wicked/wicked-cool-shell-script-library.shtml 找到。

Linux Journal 为我们发布的读者投稿技术技巧支付 100 美元。 将您的技巧和联系方式发送至 techtips@linuxjournal.com

加载 Disqus 评论