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
你可以将crontab命令执行结果重定向一下就看出来了:
0 2 * * * /home/tomc/backup/ommb/backup.sh > /tmp/backup.log 2>&1追答
确认了吗?脚本打包之前可以查看一下,ls *.dmp *.log就够了
再说如果文件存在的话,打完包也会被删除的,而从你的贴图看却仍然存在
另外可以试试把crontab和sh脚本里的口令改成为全路径
比如 /bin/bash
/bin/tar追问
crontab的容已近补充了,麻烦你看看,有没有问题;
你说的sh脚本中口令全路径具体指解释下呗。
脚本里
最上面加一句
#!/bin/sh
再试试
已贴出
追答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
命令(甚至是SCRIPT
和CODE
签名)旨在用于安装操作,而不用于任何其他副作用。
此处的正确做法是生成带有安装后脚本的本机软件包 (DEB/RPM),其中使用系统提供的宏(如 here 所述),您可以正确安装软件包。查看CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
提供包安装操作的方式。
另一个坏事是使用硬编码路径 (/usr/bin/
)。顺便说一句,我建议/usr/sbin/
为(纯)守护程序应用程序提供更好的地方。查看GNUInstallDirs
模块附带 CMake 以获取更多参考。
【讨论】:
我问的是 CMake only,systemctl
调用只是一个示例。实际上,我在安装过程中通过cmake
和dpkg
做了很多不同的事情——但我不想在打包过程中做这些事情。如果 CMake 不能做到这一点,那是 CMake 的问题,但不是我的问题。 /usr/bin
目录用法也是一个例子,我可以使用任何其他目录。
重点是不要做任何与 CMake 配置中的构建或打包过程无关的事情。将你的 很多不同的东西 移动到一些帮助脚本或其他任何东西——它不是你项目的一部分,显然,它应该是你的包的安装后操作。如果您在本地执行sudo make install
,只需在...之后执行sudo ./run-post-install.sh
并将这些操作也包含到Debian 控制文件中。但是,真正的方法是在您不需要在本地 make install
时设计您的项目! :)
是的,这不是你的问题......这是你对开发过程的理解的问题(w/ CMake %)。可能我可以猜到将 CPack 执行的 make install
与手动执行区分开来的方法,但它将基于实现细节,因此不能被视为解决由于 CMake 的奇怪使用而引发的问题的可靠解决方案%)
我从这次谈话中得出的结论是,CMake 不允许目标 install
和 package
很好地共存
做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 添加到系统定时任务中执行就无法打包的主要内容,如果未能解决你的问题,请参考以下文章
linux脚本定期对日期命名的文件夹打包,Vbs压缩备份文件夹以日期命名