linux中打包备份脚本,手动执行可以正常打包,使用crontab -e 添加到系统定时任务中执行就无法打包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中打包备份脚本,手动执行可以正常打包,使用crontab -e 添加到系统定时任务中执行就无法打包相关的知识,希望对你有一定的参考价值。

以下为备份脚本:

意思是将/home/tomc/backup/ommb/下的.dmp文件和.log文件以.tar.gz打包备份到/home/tomc/backup/ommb/下。
以下为手动执行和使用crontab -e添加到系统自动执行的结果:

最上面一条20140721.tar.gz是我执行./backup.sh备份脚本后产生的打包备份文件;
下面7月23日生成的文件时系统自动执行生成的文件,.dmp和.log没有被打包进去,而又生成了一个20140723.tar.gz的包,解开后里面是空的。

我个人的分析:1、权限都是root权限,不存在权限过低的问题,使用777的权限也不行;
2、脚本应该没有问题,手动执行都可以正确的打包备份的;
3、感觉是问题出在crontab 这个系统定时执行的上面了,具体有不知道该怎么排查;

麻烦各位大神了!!!
以下是crontab的内容:

意思是每天凌晨2点执行/home/tomc/backup/ommb/下的backup.sh

打包备份时,dmp和log文件还没生成
你可以将crontab命令执行结果重定向一下就看出来了:
0 2 * * * /home/tomc/backup/ommb/backup.sh > /tmp/backup.log 2>&1追答

确认了吗?脚本打包之前可以查看一下,ls *.dmp *.log就够了
再说如果文件存在的话,打完包也会被删除的,而从你的贴图看却仍然存在

参考技术A 自动执行之前应该已经手动一遍了,已经将dmp和log remove掉了,然后自动时候找不到这两个文件 参考技术B 写crontab的 内容是怎么写的?

另外可以试试把crontab和sh脚本里的口令改成为全路径
比如 /bin/bash
/bin/tar追问

crontab的容已近补充了,麻烦你看看,有没有问题;
你说的sh脚本中口令全路径具体指解释下呗。

追答

脚本里
最上面加一句
#!/bin/sh
再试试

参考技术C 把你的crontab也贴出来看看?追问

已贴出

追答

lizhihong404言之有理.
.dmp, .log, .tag.gz三个文件的创建时间是相同的. 这很可能会导致问题.
也许tar命令运行的时候还没有dmp和log文件. 这也解释了为什么2个文件没有被删掉.

你改一下backup.sh 最后一行加上&>/home/tomc/backup/ommb/cron-tar.log

事后检查log应该能看出问题.

CMake - 如何在打包期间阻止执行安装脚本?

【中文标题】CMake - 如何在打包期间阻止执行安装脚本?【英文标题】:CMake - how to block executing installation scripts during packaging? 【发布时间】:2018-09-13 23:46:29 【问题描述】:

我的CMakeLists.txt 文件包含命令,应该由make install 执行,所有这些都可以正常工作。下面的示例 CMakeLists.txt 是我实际 CMake 文件的简短摘录(tm0001.cpp 的内容在这里并不重要 - 它可能是任何 C++ 程序):

cmake_minimum_required(VERSION 3.12)

project(tm0001)

set(CMAKE_CXX_STANDARD 11)
add_executable($PROJECT_NAME tm0001.cpp)

install(
  TARGETS $PROJECT_NAME
  DESTINATION /usr/local/bin
  PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)

install(CODE "message(\"-- This must be called during installation only\")")

set(CPACK_PACKAGE_CONTACT "HEKTO")
set(CPACK_GENERATOR "DEB")
include(CPack)

我看到message 命令也是由make package 执行的,这不是我想要的。

如何通过make package 命令告诉CMake 执行安装脚本?我找不到使用 CMake if 命令的任何方法。

【问题讨论】:

您能否提供一个最小的CMakeLists.txt 来重现问题? @compor - 完成,谢谢 从打包者的角度来看,我认为在安装包时更改系统状态是个坏主意。也许改为添加一条消息,管理员应该重新启动守护程序。 【参考方案1】:

正如评论中已经说过的那样,通过install 命令“使用systemd”(并执行与项目的构建或打包无关的任何事情)是一个非常糟糕的主意。 install 命令(甚至是SCRIPTCODE 签名)旨在用于安装操作,而不用于任何其他副作用

此处的正确做法是生成带有安装后脚本的本机软件包 (DEB/RPM),其中使用系统提供的宏(如 here 所述),您可以正确安装软件包。查看CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA 提供包安装操作的方式。

另一个坏事是使用硬编码路径 (/usr/bin/)。顺便说一句,我建议/usr/sbin/ 为(纯)守护程序应用程序提供更好的地方。查看GNUInstallDirs 模块附带 CMake 以获取更多参考。

【讨论】:

我问的是 CMake onlysystemctl 调用只是一个示例。实际上,我在安装过程中通过cmakedpkg 做了很多不同的事情——但我不想在打包过程中做这些事情。如果 CMake 不能做到这一点,那是 CMake 的问题,但不是我的问题。 /usr/bin 目录用法也是一个例子,我可以使用任何其他目录。 重点是不要做任何与 CMake 配置中的构建或打包过程无关的事情。将你的 很多不同的东西 移动到一些帮助脚本或其他任何东西——它不是你项目的一部分,显然,它应该是你的包的安装后操作。如果您在本地执行sudo make install,只需在...之后执行sudo ./run-post-install.sh 并将这些操作也包含到Debian 控制文件中。但是,真正的方法是在您不需要在本地 make install 时设计您的项目! :) 是的,这不是你的问题......这是你对开发过程的理解的问题(w/ CMake %)。可能我可以猜到将 CPack 执行的 make install 与手动执行区分开来的方法,但它将基于实现细节,因此不能被视为解决由于 CMake 的奇怪使用而引发的问题的可靠解决方案%) 我从这次谈话中得出的结论是,CMake 不允许目标 installpackage 很好地共存 nice的事情,一切都会nice :) -- 做dirty的事情......你知道 % ) 对我来说,这两个目标在相当复杂的项目中可以很好地共存。【参考方案2】:

我所做的是将带有 CODE/SCRIPT 的安装命令指定为单独的组件,例如安装(代码 ... 组件安装后)。

然后还添加了其他非代码安装命令作为不同的组件,例如安装(文件...组件文件-安装)

然后需要将 CPack 配置为仅打包文件-安装组件(此问题的解决方案很容易找到 - 提示:使用 CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE、CPACK_COMPONENTS_ALL 和 CPACK_(RPM/DEB/...)_COMPONENT_INSTALL 变量)。

当然,生成的包在安装包期间不会运行这些 CODE 组件 - 它们需要作为安装后脚本单独添加。

【讨论】:

【参考方案3】:

我正在回答我自己的问题,因为现有答案没有解决我的主要问题。我找不到任何方法(在 CMake 级别上)阻止 install 命令在 make package 期间运行 - 甚至 postinst 脚本也被此命令调用。

幸运的是,我可以修改 postinst 脚本本身,使其不做任何事情,以防它被 不是由 dpkg 调用:

if [ -z $DPKG_ADMINDIR ]; then
  echo "postinst: missing 'dpkg' environment (not an error during packaging)"
  exit 0
fi

这当然是个技巧,但它对我有用。

【讨论】:

以上是关于linux中打包备份脚本,手动执行可以正常打包,使用crontab -e 添加到系统定时任务中执行就无法打包的主要内容,如果未能解决你的问题,请参考以下文章

Mysql定时备份数据脚本

linux脚本定期对日期命名的文件夹打包,Vbs压缩备份文件夹以日期命名

用脚本实现linux2个月前的会话日志打包备份到指定文件夹并删除

Centos 备份常用命令

CMake - 如何在打包期间阻止执行安装脚本?

linux下tar打包的压缩率问题