如何正经的实现shell脚本单例运行
如何正经的实现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是端口号,如果脚本运行时发现这个端口已经被占用了,则表明脚本已经在运行了。
相关文章