【问题标题】:Delete a newly created file using shell script after 5 minutes5 分钟后使用 shell 脚本删除新创建的文件
【发布时间】:2021-11-04 01:28:09
【问题描述】:

我正在编写一个 shell 脚本,我在路径 /path/to/ABC/ABC.txt 中创建一个文件 ABC.txt
现在我在脚本的最后,我想安排一个 cron 作业在 5 分钟后删除这个文件(只有一次,不会重复)。
我不能在此脚本中添加 5 分钟的 sleep,因为它被服务器上的多个用户用于多个路径/文件。用户执行此脚本 5 分钟后,相应路径中对应的 file.txt 应被删除。

我从 cronjob 中了解到,您可以使用 crontab -e 触发脚本,然后提供作业的定期符号和脚本路径 H/5 * * * * /bin/sh /path/to/ABC/ABC.txt

谁能告诉我如何使用 cron 来安排这样的功能。如果有更好的方法,请提出建议。

【问题讨论】:

  • 不是更适合at 的工作吗? cron 用于定期作业,at 用于执行一次的作业。另一种可能性是从脚本中分离“睡眠和删除”过程,将其置于后台,即(sleep 5; delete ABC.txt) &
  • 不会因为父进程(脚本)没有终止而在 5 分钟内导致额外的 cpu 负载?我正在为多个用户创建此脚本,因此可能有 100 多个用户同时执行此脚本。那会是瓶颈吗?
  • 如果发现 sleep 是由 busy loop 实现的,我会重新格式化我的硬盘并安装一个值得拥有的操作系​​统名称(Linux、BSD Unix、....)。 “睡眠”的主要缺点是,如果有人在睡眠过程中重新启动计算机,则文件不会被删除,而 at - 至少是 AFIK,已经很久没有使用该命令了 - 删除将在重新启动后完成。如果这是一个问题,为了安全起见,您可能需要通过 Super User 询问。
  • 我用sleep 300 实现了几秒钟。它正在工作。我会尽快增加用户数量来更新它。将阅读at 并更新

标签: linux shell cron scheduled-tasks script


【解决方案1】:

使用at 命令:

#!/usr/bin/env bash
script_path="$(realpath -s -- "$0")"
# start script
...
# end script
echo "rm -- \"$script_path\"" | at "now + 5 minutes"

使用带睡眠的后台进程:

#!/usr/bin/env bash
script_path="$(realpath -s -- "$0")"
# start script
...
# end script
( sleep 300 && rm -- "$script_path" ) &

使用父进程selfdestruct

写一个小脚本selfdestruct,看起来像:

#!/usr/bin/env bash
dt="$1"; shift
"$@"
( sleep "$dt" && rm -- "$1" ) &

然后运行你的脚本

$ selfdestruct 300 /path/to/script arg1 arg2 arg3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多