Linux开发 之 备份:make bak

本文介绍了一种使用Makefile实现从Linux系统自动备份文件到Windows系统的方案。通过设置共享文件夹并利用smbfs进行挂载,文章详细说明了Makefile的编写过程及其各步骤的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

前些日子一直在想个问题:怎样用Makefile只执行一个命令,就把我VMlinux上的文件备份到Win
make bak
当然由于Linuxwin天生的不合,若是不用samba 还真想不出用什么来实现了(e_e)
思路是这样的:

现在WIN上建文件,设置(比如e:/MyProject)共享,
为了安全给共享设置用户和权限,比如用户名Guest,密码zanget
(
设置Guest密码的步骤为:我的电脑上点击右键->管理->本地用户和组->用户->右键选择Guest->设置密码)
当然读写权限都必须给Guest

然后就是Makefile的事情了。代码如下:

 

1.  bak : 

2.                  prjName=$(shell basename `pwd`);/

3.                  bakfile=$$prjName-`date +%Y%m%d.%H%M%S`.tar.gz;/

4.                  if [ ! -e ../bak/$$prjName ]; then mkdir -p ../bak/$$prjName; fi;/

5.                   cd .. && tar zcvf  bak/$$bakfile  $$prjName > /dev/null;/

6.                   if [ ! -e /mnt/win ]; then mkdir /mnt/win; fi;/

7.                    mount -t smbfs -o username=Guest,password=zanget //172.16.17.62/MyProject /mnt/win &&/

8.                   if [ ! -e /mnt/win/$$prjName ]; then mkdir /mnt/win/$$prjName; fi&&/

9.                   cp bak/$$bakfile /mnt/win/$$prjName &&/

10.     umount /mnt/win

 

 

 

 

 

 

 

解释:
1.
一般Makefile是放在某个工程文件目录下面的,这个文件目录可称为工程名prjName,这样写可通过shell获取到目录名,这样Makefile移植性会很好(放在那个工程文件下都可不需要因为工程名变化而修改了)

 

2.bakfile是通过date命令获取到例如20080920.145719格式的唯一文件名。

 

3.然后在和 工程文件同目录 的路径下 创建/bak/$$prjName目录(若目录不存在),用于存放备份文件。

 

4.打包并压缩工程文件目录 下所有文件,并存放到 3.中创建的目录下,文件名在1.中定义。

 

5.判断是否/mnt/win存在,否则创建目录,用于挂载。

 

6.挂载,并指定在WIN上设定的用户名和密码和5.中创建的挂载目录。

 

7.判断WIN e:/MyProject$$prjName是否存在,若不存在则创建之。

 

8.4.中产生的文件拷贝到WIN e:/MyProject $$prjName目录下。

 

9.卸载6.中挂载的smbfs文件系统。

 

疑难:
    a.$$prjName
$prjName不同,参考我的另外一篇文章。

    

    b.尾部的“/”是必须的,若去掉“/”Make将启动多个shell进程去执行,这样前面定义的变量prjNamebakfile将在子shell中不可见,对它们的引用将都得到空值。

    

    c.prjName=$(shell basename `pwd`)这样的定义不能放到除了 这个代码块 的其他地方,否则对其用shell变量的应用方式会得到b.(空值)的结果

(放到其他地方,可作为Makefile中的变量来引用$prjName,但是bakfile的处理就不如意了:每次对$prjName的引用,都会用`date +%Y%m%d.%H%M%S`这样的shell的命令来代替,换言之,每次都可能得到不同的文件名的结果:因为这个变量本身是由date计算得到的,可想像,若是步骤4-8的执行超过1s,则8.cp命令将不会成功(为何呢?))

(ps:最开始我就是一直吧这2个变量的定义放到 文件最开始,但是的到的结果总不能令人满意)

 

bug
    若是6.成功 而 7./8.中有执行失败的,则Make不会去执行 9. 这样就倒是挂载的目录/mnt/win 没有被卸载,这样会导致其他系统问题,这个我到是没想到有什么好点方法解决。 

 

 

### Makefile 错误解决方案 当遇到 `Makefile` 中特定行号(如第 656 行)的错误时,通常需要分析该行的具体语法或逻辑问题。以下是可能的原因及其对应的解决方案: #### 可能原因一:权限不足 如果目标文件或脚本缺少执行权限,则可能会触发类似于 `execvp Permission Denied Error: 127` 的错误消息[^1]。这种情况下可以尝试通过更改文件权限来解决问题。 ```bash chmod +x 文件名 ``` 此命令会赋予指定文件可执行权限。如果涉及多个文件,建议批量处理相关依赖项。 --- #### 可能原因二:路径配置不正确 某些 `Makefile` 配置中可能存在硬编码路径,这些路径在当前环境中不可访问或者不存在。例如,在 Oracle Linux 或其他基于 Unix 的系统安装过程中,可能出现类似 `Error in invoking target 'agent nmhs'` 的错误[^2]。此时应检查 `$ORACLE_HOME/sysman/lib/ins_emagent.mk` 文件中的路径设置是否匹配实际环境。 具体操作如下: 1. 打开 `Makefile` 并定位到第 656 行。 2. 查看是否有未定义变量或无效路径引用。 3. 如果发现路径问题,调整为目标系统的有效路径。 --- #### 可能原因三:编译器版本兼容性 有时,`Makefile` 使用的工具链(如 GCC 编译器)与操作系统默认版本不符也会引发错误。对于这种情况,可以通过更新或切换编译器版本解决。 验证方法: ```bash gcc --version ``` 若版本过旧或不符合需求,可通过包管理器升级: ```bash sudo yum install gcc ``` 随后重新运行构建流程以确认修复效果。 --- #### 可能原因四:备份并修改原始 `Makefile` 针对已知的常见问题场景,比如 Oracle 数据库安装期间发生的 `agent nmhs` 相关错误[^3],推荐先备份原版 `Makefile` 后再编辑修正潜在缺陷。 步骤说明: 1. 创建副本以防意外破坏原有结构; ```bash cp $ORACLE_HOME/sysman/lib/ins_emagent.mk $ORACLE_HOME/sysman/lib/ins_emagent.mk.bak ``` 2. 利用文本编辑器打开源文件进行逐行排查直至找到可疑位置; ```bash vi $ORACLE_HOME/sysman/lib/ins_emagent.mk ``` 特别注意第 656 行附近的内容是否存在拼写失误或其他异常情况。 --- #### 示例代码片段 假设第 656 行存在以下形式的目标声明: ```makefile target_name: $(CC) -o output_file source_files.c $(CFLAGS) ``` 需确保所有宏参数均已正确定义且指向合法资源;否则补充缺失部分或将不确定因素替换为绝对值测试其行为表现如何变化。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值