如何在Shell脚本中实现单例

SMerrill8

在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#中实现单例设计模式?

来自分类Dev

如何在子类中实现单例模式

来自分类Dev

如何在shell脚本中实现logrotate

来自分类Dev

如何在单例中传递参数

来自分类Dev

如何在JVM中修复单例?

来自分类Dev

如何在JUnit中“隔离”单例?

来自分类Dev

如何在 Swift 中启动单例?

来自分类Dev

如何在 bash/shell 脚本中实现 tree 命令?

来自分类Dev

如何正确调用单例实现

来自分类Dev

可以在OSGi环境中实现单例

来自分类Dev

Java中的单例模式实现

来自分类Dev

在MeteorJS中实现单例的最佳方法

来自分类Dev

在通用Typescript类中实现单例

来自分类Dev

在MeteorJS中实现单例的最佳方法

来自分类Dev

javascript中单例的正确实现

来自分类Dev

如何在单例中创建QML对象?

来自分类Dev

如何在Rust中制作安全的静态单例?

来自分类Dev

如何在Scala中创建通用类型的对象/单例?

来自分类Dev

如何在vala中创建线程安全的单例?

来自分类Dev

如何在Polymer中创建单例元素

来自分类Dev

如何在单例NSMutableArray中添加对象

来自分类Dev

如何在Javascript中创建单例类?

来自分类Dev

如何在erlang nif中编写单例资源?

来自分类Dev

如何在IntellijIDEA中从.form使Java单例?

来自分类Dev

如何在iOS中创建单例类?

来自分类Dev

如何在C ++中创建简单的单例类?

来自分类Dev

如何在单例类中调用同级函数?

来自分类Dev

如何在Android的单例类中制作进度栏

来自分类Dev

如何在python中以单例继承基类