0

我正在对我调用的脚本进行一些测试flock,但遇到了一些我不明白的事情。pkilltest.shcron

test.sh安排为* * * * *cron 中的作业。它是一个非常简单的脚本,用于测试目的将时间戳写入文件,然后休眠 5 分钟。这是为了确认flock运行良好并防止同一脚本出现多个进程。

这部分运行良好,因为我每 5 分钟只看到一个时间戳显示,尽管test.sh计划每分钟运行一次。

现在作为一项额外的安全措施,我想杀死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不推荐,有没有其他方法可以在一定时间后杀死我的进程?最好不必编辑原始脚本。

4

1 回答 1

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对这些重复文件描述符中的任何一个的显式操作释放的,或者当所有此类文件描述符都已关闭时释放。

于 2018-06-20T07:14:08.943 回答