杀人还没有完全消除过程?

时间:2018-06-20 05:52:01

标签: bash cron flock pkill

我正在对flock调用的pkill脚本使用test.shcron做一些测试,但遇到了我不理解的问题

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,是否还有其他方法可以在一定时间后终止我的进程?最好不必编辑原始脚本。

1 个答案:

答案 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操作或在所有这些文件描述符都已关闭时来释放锁定。