【问题标题】:pkill isn't fully killing process? [closed]pkill 不是完全杀死进程吗? [关闭]
【发布时间】:2018-06-20 05:52:01
【问题描述】:

我正在使用flockpkill 对我从cron 调用的test.sh 脚本进行一些测试,但遇到了一些我不明白的事情。

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,有没有其他方法可以在一段时间后杀死我的进程?最好不必编辑原始脚本。

【问题讨论】:

  • 请出示您的 .sh 文件。
  • 我的 .sh 非常简单。 echo "this is a test" >> test.txt sleep 1800 抱歉,格式不好,我这辈子都不知道如何让堆栈不被他们不可能的格式吸住。

标签: bash cron flock pkill


【解决方案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 操作或在所有此类文件描述符已关闭时释放锁定

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2019-02-25
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多