在kornshell中,`basename $ 0`为我提供了当前脚本的名称。
我如何利用$$或$ PPID来实现单个模式,只有一个名为`basename $ 0`的脚本被任何用户在此服务器上执行?
ps -ef|grep `basename $0`
这将显示正在运行的所有正在运行的脚本名称的进程。
我需要一个脚本,当一个不是$$的线程运行名为`basename $ 0`的脚本时,该脚本可以中止。
答案 0 :(得分:1)
要提供无种族互斥,flock
是您的朋友。如果您不在Linux上 - provided by util-linux - portable version可用。
如果您真的希望它适用于整个系统 - 跨越用户帐户 - 您需要一个锁定目录才能让所有用户都可以创建文件,并且您需要确保所有用户都可以写入您的锁文件。
假设您拥有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
一个关键注意事项:不要尝试在脚本退出时删除锁定文件。如果您处于其他人正在积极尝试获取锁定的情况下,他们已经在该现有文件上拥有文件描述符;如果您在文件上有句柄时删除该文件,您只需确保一个竞赛,其中该程序可以认为它持有锁,而其他人创建一个同名的新文件并将其锁定。