在kornshell中,`basename $ 0`给我当前脚本的名称。
我将如何利用$$或$ PPID来实现单例模式,即只有一个用户在该服务器上执行一个名为`basename $ 0`的脚本?
ps -ef|grep `basename $0`
这将向我显示所有正在运行的进程,这些进程具有当前正在运行的脚本的名称。
我需要一个脚本,当不是$$的线程正在运行名为`basename $ 0`的脚本时,该脚本可以中止。
提供无种族的互斥体,flock
是您的朋友。如果您不是在Linux上-在那里的由util的Linux的提供-一个便携版本可用。
如果您确实希望它适用于整个系统-跨用户帐户-您将需要一个目录来存放所有用户可以创建文件的锁,并且需要确保所有用户都可以写入您的文件锁定文件。
假设您具有该flock
实用程序,则想要参与该协议的每个程序的行为都可以如下所示:
#!/bin/ksh
umask 000 # allow all users to access the file we're about to create
exec 9>"/tmp/${0##*/}.lck" # open lockfile on FD 9, based on basename of argv[0]
umask 022 # move back to more restrictive file permissions
flock -x -n 9 || exit # grab that lock, or exit the script early
# continue
一项主要注意事项:脚本退出时,请勿尝试删除锁定文件。如果您处于其他人正在积极尝试获取锁的情况下,那么他们在该现有文件上已经有文件描述符了;如果您在文件具有句柄的情况下删除该文件,则只需确保该程序可以认为该文件持有该锁,而其他人以相同的名称创建一个新文件并对其进行锁定就可以了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句