我正在对flock
调用的pkill
脚本使用test.sh
和cron
做一些测试,但遇到了我不理解的问题
test.sh
被安排为cron中的* * * * *
作业。它是一个非常简单的脚本,出于测试目的,该脚本将时间戳记写入文件,然后休眠5分钟。这是为了确认flock
正常运行,并防止同一脚本出现多个进程。
此部分运行良好,尽管test.sh
被安排为每分钟运行一次,但我每5分钟只能看到一个时间戳。
现在,作为一项额外的安全措施,我想杀死test.sh
(因为我实际上想使用的脚本有时似乎会挂起,使用AWS CLI将某些文件同步到S3)
所以我认为pkill
是最简单的,因为它不需要修改现有脚本。
如果我运行pkill -9 -f test.sh
,则表示进程已终止。运行ps aux | grep test.sh
,我确实再也看不到任何test.sh
进程了。
尽管应该cron
每分钟test.sh
,但我希望终止该过程后,它会在一分钟内重新开始。
但是,似乎该脚本直到睡眠期结束才真正重启。
因此该脚本最初在例如12:00
,睡眠将持续到12:05
。如果我在12:02
上杀死了脚本,我希望它可以在12:03
上再次运行,但直到12:05
才与睡眠期保持一致。
为什么会这样?另外,如果不建议使用pkill
,是否还有其他方法可以在一定时间后终止我的进程?最好不必编辑原始脚本。
答案 0 :(得分:1)
请参见以下示例:
1 exec 9> /tmp/flock.tmp
2 if ! flock -n 9; then
3 echo "locked by others!"
4 exit 1
5 fi
6
7 sleep 300
第1行在锁定文件上打开FD 9。第2行的flock
在FD上设置了锁定。第7行的sleep
继承了FD并保持锁定状态。 pkill
.sh
脚本不会杀死sleep
,因此FD仍被锁定,直到sleep
完成。因此,要清理,您需要在flock
之后终止所有正在运行的进程。
flock(1)
使用flock(2)
并根据flock(2)
:
由
flock()
创建的锁与打开的文件描述相关联(请参见open(2)
)。这意味着重复的文件描述符(例如,由fork(2)
或dup(2)
创建)引用相同的锁,并且可以使用这些文件描述符中的任何一个来修改或释放此锁。此外,通过对这些重复文件描述符中的任何一个的显式LOCK_UN
操作或在所有这些文件描述符都已关闭时来释放锁定。