如何正经的实现shell脚本单例运行

2023-04-12 02:49:00 运行 脚本 正经

如何正经的实现shell脚本单例运行

一般情况下,当我们执行一个shell脚本时,都希望它只运行一次。但是有时候,我们会发现脚本运行了好几次。为什么会这样呢?

原因有很多,比如脚本中没有判断是否已经运行过了,或者脚本中有死循环。

那么,如何才能正经的实现shell脚本的单例运行呢?

方法一:使用flock命令

flock命令可以用来控制对文件的访问,它可以防止多个进程同时对文件进行读写操作。

使用flock命令实现脚本的单例运行非常简单,只需要在脚本开头加上如下代码即可:

flock -n /tmp/test.lock -c "command1; command2; ..."

如果脚本中有多条命令要执行,可以使用分号来分隔命令。

上面代码中的/tmp/test.lock是一个临时文件,用来保存当前脚本的运行状态。

当脚本运行结束后,这个临时文件会被自动删除。

如果脚本中没有使用exit命令显式退出,那么这个临时文件会一直存在,直到脚本被强制终止。

如果脚本运行时发现/tmp/test.lock文件已经存在,则表明脚本已经在运行了,那么这次运行就会被中断。

方法二:使用pgrep命令

pgrep命令可以用来查找进程。

使用pgrep命令实现脚本的单例运行非常简单,只需要在脚本开头加上如下代码即可:

if pgrep -f "script_name" > /dev/null 2>&1; then echo "script is running" exit 1 fi

上面代码中的script_name是脚本的名称,可以使用$0变量来获取。

方法三:使用pidof命令

pidof命令可以用来查找进程的ID。

使用pidof命令实现脚本的单例运行非常简单,只需要在脚本开头加上如下代码即可:

if pidof -x "script_name" >/dev/null; then echo "script is running" exit 1 fi

上面代码中的script_name是脚本的名称,可以使用$0变量来获取。

方法四:使用ps命令

ps命令可以用来查看进程的信息。

使用ps命令实现脚本的单例运行非常简单,只需要在脚本开头加上如下代码即可:

if ps -ef | grep "script_name" | grep -v grep > /dev/null 2>&1; then echo "script is running" exit 1 fi

上面代码中的script_name是脚本的名称,可以使用$0变量来获取。

方法五:使用lsof命令

lsof命令可以用来查看文件的打开情况。

使用lsof命令实现脚本的单例运行非常简单,只需要在脚本开头加上如下代码即可:

if lsof -nP -i4TCP:8080 | grep LISTEN > /dev/null; then echo "script is running" exit 1 fi

上面代码中的8080是端口号,如果脚本运行时发现这个端口已经被占用了,则表明脚本已经在运行了。

方法六:使用netstat命令

netstat命令可以用来查看网络连接情况。

使用netstat命令实现脚本的单例运行非常简单,只需要在脚本开头加上如下代码即可:

if netstat -an | grep ":8080" > /dev/null; then echo "script is running" exit 1 fi

上面代码中的8080是端口号,如果脚本运行时发现这个端口已经被占用了,则表明脚本已经在运行了。

相关文章