Unix Shell脚本通过crontab执行后删除自身所有痕迹

Unix Shell脚本通过crontab执行后删除自身所有痕迹

我的问题有两部分。非常感谢对这两个部分的帮助。

给出的信息: - 假设有 2 个文件夹,文件夹 A 和文件夹 B。 - 文件夹 A 包含许多文件。 - 文件夹 B 包含 Shell 脚本 (code.sh)

A 部分: 脚本 code.sh 必须删除文件夹 A 中的所有文件,然后删除文件夹 B 包括脚本 code.sh

B 部分: 此外,这还必须通过 crontab 在某个特定时间进行安排,这本身并不是问题。但是,在脚本删除文件夹 A 的内容后,它应该从 crontab 中删除其条目,然后继续删除文件夹 B,如 A 部分中所述。

以上可能吗?如果是这样,有人可以告诉我如何做,或者至少指出我正确的方向。我是 UNIX 新手,因此我们将不胜感激。

笔记:整个过程中,只有crontab中的脚本(code.sh)需要手动调度。

答案1

如果此脚本以 root 身份运行...则可以通过从 /var/spool/cron/root 中删除其 crontab 行来从 crontab 中删除该条目。 (这就是什么crontab -lcrontab -e用途)。

在删除命令的末尾添加以下行(用 {pattern} 替换脚本名称):

sed -i '/{pattern}/d' /var/spool/cron/root

因此,如果您在运行的 crontab 中输入代码.sh好像

0 21 * * * /etc/cron.daily/code.sh

命令是:

sed -i '/code.sh/d' /var/spool/cron/root

这将从根 crontab 文件中删除包含“code.sh”的行。

您可以将上面的行添加到脚本末尾,以便删除两个文件,并从 crontab 中删除该条目。正如@Barmar 所说,您可以暂时删除这两个文件夹。

是的,这是一个非常古老的问题,但是关于从中删除的直接问题定时任务具体来说还需要一个答案。

答案2

只要脚本有删除文件的权限,就绝对没有问题。在基于 UNIX 的系统上,脚本更改或删除其源文件没有任何限制。文件系统结构的处理方式是,仅当所有进程关闭该文件时,才会释放与该文件关联的物理存储(删除后,该文件将不再在目录结构中可见,但仍保留指向该文件的 inode 的进程)文件数据可以访问它:只有当没有人记得inode时,文件才会丢失)。

当然,除非正在读取脚本的解释器想要关闭并重新打开文件。重击应该不成问题。

而且,这看起来像是一项一次性工作。不要使用crontab.使用at或 甚至只是sleep amount && ./script这通常是执行此操作的快速而肮脏的方法(但如果机器重新启动或终端关闭则不起作用)。

相关内容