首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保一次只运行一个busybox脚本的实例而没有锁(文件)?

如何确保一次只运行一个busybox脚本的实例而没有锁(文件)?
EN

Stack Overflow用户
提问于 2018-09-02 21:52:22
回答 1查看 1.4K关注 0票数 1

在一个具有相当有限的Busybox (版本1.24.2) shell的路由器中,我希望确保备份(rsync) shell脚本只在它尚未运行时执行。

一个完整的鞭子壳的答案如下:

  1. Quick-and-dirty way to ensure only one instance of a shell script is running at a time
  2. Shell script: Ensure that script isn't executed if already running

与残废的灰壳不兼容。

路由器固件提供这些busybox命令:

代码语言:javascript
复制
[, [[, addgroup, adduser, arp, arping, ash, awk, basename, bash, brctl, bunzip2, bzcat, bzip2, cat, chgrp, chmod, chown, chpasswd, chroot, clear, cp, crond, crontab, cut, date, dd, df,
dhcp6c, dirname, dmesg, dnsdomainname, dos2unix, du, echo, egrep, eject, env, ether-wake, expr, false, fdisk, fgrep, find, flock, free, fuser, grep, gunzip, gzip, head, hostname,
ifconfig, inetd, insmod, kill, killall, klogd, ln, logger, login, ls, lsmod, lsof, md5sum, mdev, microcom, mkdir, mknod, mkswap, modprobe, more, mount, mountpoint, mv, netstat, nice,
nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, printf, ps, pwd, rm, rmdir, rmmod, route, sed, sendmail, seq, sh, sleep, sort, start-stop-daemon, stat, strings, swapoff, swapon,
switch_root, sync, sysctl, syslogd, tail, tar, tee, telnetd, test, time, top, touch, tr, traceroute, traceroute6, true, udhcpc, umount, uname, uniq, unix2dos, unlink, uptime, usleep,
vconfig, vi, watch, wc, wget, which, whoami, xargs, yes, zcat, zcip 

self-invocation solution确实在第一次调用时返回exit 1。使用的测试脚本:

代码语言:javascript
复制
#!/bin/sh
[ "${FLOCKER}" != "$0" ] && exec /usr/bin/env FLOCKER="$0" /usr/bin/flock "$0" "$0" "$@" || exit 1
echo "servus!"
/bin/sleep 30

ps建议来自https://unix.stackexchange.com/questions/48505/how-to-make-sure-only-one-instance-of-a-bash-script-runs#answer-48511的一个答案是有希望的,但仍然不兼容路由器减少的Busybox外壳。Busybox附带了ps命令,但只附带了选项wlT

有什么建议吗,不要用这个脚本捕捉nano或其他编辑器?

EN

回答 1

Stack Overflow用户

发布于 2018-09-02 21:52:22

flock似乎有必要避免创建一个竞赛条件。一种基于flock的解决方案,适用于busybox 1.24.2:

代码语言:javascript
复制
#!/bin/bash

scriptname=$(basename $0)
lock="/var/run/${scriptname}"

exec 200>$lock
flock -n 200 || { echo "Error: Another copy of $0 is running. Exiting" ; exit 1; } 

pid=$$
echo $pid 1>&200

## Sample code
sleep 60
echo "Hello world"

来源:https://linuxaria.com/howto/linux-shell-introduction-to-flock

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52141287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档