我正在运行一个脚本,该脚本旨在处理一些实用程序以恢复一些数据。该脚本位于用户可以放置需要恢复的文件的目录中。由于许多用户可以访问此目录并运行脚本,因此我希望有一个条件来检查脚本是否已在运行。如果是,则回显“稍后再试”消息;否则,照常运行。
我在这里做了一些研究,并认为这是我的功能的工作代码,如上所述。
#!/bin/bash
me="$(basename "$0")";
running=$(ps h -C "$me" | grep -wv $$ | wc -l);
[[ $running > 1 ]] && exit;
我想在 Solaris SunOS 5.8 中实现此功能和上面的代码。我知道 ps 在 Unix 和 Linux 中的功能不同。
答案1
您使用的 ps 命令与 UNIX 无关。
BSD 中使用了“ instead key letters
of” ,但从未将其纳入标准。 BSD 甚至以与您想象的不同的方式使用密钥字母。options
ps
h
我建议使用:
ps -p $$
如果您想检查此脚本是否有更多实例,请使用:
myname=`basename $0`
pids=`pgrep -d, $myname`
ps -p $pids
理论上,您甚至不需要再运行,检查逗号ps
的输出就足够了。pgrep
如果您想实现锁定文件算法并拥有 POSIX 兼容的 shell,您可以使用:
set -o noclobber
:> /var/tmp/myscript
if [ $? -ne 0 ]; then
echo already running
exit 1
fi
... do some stuff
rm /var/tmp/myscript
这是否可靠地工作取决于 shell 是否按照 POSIX 喜欢的方式实现 noclobber。有些 shell 可能无法自动实现此功能,因此您需要知道您的 shell 是否正常。