Skip to main content

小技巧

批量重命名

在处理一些数据集的时候,我们经常会碰到数据集的文件名是按时间戳(timestamp),或者其他方式命名的文件,如:12345679.jpg、sunshine.txt

而我们在编写程序时,往往希望读入的这些数据集的文件名是一种更简洁的形式,比如按照索引(index)方式:1.png,2.png,3.png...

那么如何批量重命名一个文件夹下的文件名呢?方法很简单,只需要在终端里面进入数据集所在的文件夹,输入以下命令即可:

i=1; for x in *; do mv $x $i.jpg(或其他文件后缀名); let i=i+1; done

参考LINUX命令行下批量重命名文件名为数字索引编号(0~N.XXX)的方法

gdb 调试

在 Linux 上利用 core dump 和 GDB 调试 segfault

“段错误”是程序试图操作不允许访问或试图访问的不允许内存的情况。导致段错误的原因主要有:

  1. 试图解引用空指针(你不允许访问内存地址0);
  2. 试图解引用不在你内存中的其他指针;
  3. 一个 C++ vtable 虚表指针被破坏并指向错误的地方,这导致程序试图去执行一些不可执行的内存;
  4. 其他情况,比如未对齐的内存访问也可能会出现段错误。

在 Linux 下当应用程序发生异常中止退出或者发生崩溃的时候,Linux 内核会将应用程序在这段运行期间的内存状态等相关信息转存到磁盘,以供系统故障排查或者调试。这个转存的文件叫 core dump 文件。

core dump 文件中会记录程序当时的内存调用、堆栈引用、进程和线程调用等信息,可以帮助开发人员和维护人员了解异常发生当时的环境参数和信息,所以 core dump 对故障排查和 bug 调试具有重大的意义。

用下面的 gdb 命令打开一个 core dump 文件:

gdb -c my_core_file

接下来,我们想知道程序崩溃时的堆栈是什么。在 gdb 提示符下运行 bt 会给你一个堆栈追踪。默认情况下,编译时候没有做符号调试,gdb 无法加载二进制符号,所以追踪结果中会都是 ?? ()。

#0 0x000000000040047d in ?? ()
#1 0x00007ffdf9d6a010 in ?? ()

这种情况下,我们需要加载符号符号表,使得显示正常。可通过在 gdb 命令下执行:

symbol-file 应用的执行程序(绝对路径)
sharedlibrary # 可以只执行这一句,上面那句不用
# 举例
$ symbol-file /terra/bazel-bin/modules/drivers/v2xuu/v2xuu_component_test
$ sharedlibrary

执行后,再次输入 bt,gdb 就会返回带有行号堆栈跟踪信息。

参考在Linux上利用core dump和GDB调试segfault

crontab 定时任务

我们经常使用的是 crontab 命令是 cron table 的简写,它是 cron 的配置文件,也可以叫它作业列表。

新增调度任务可用两种方法(注意两个添加任务的命令有点不同)

  1. /var/spool/cron/crontabs 目录下存放的是每个用户包括 root 的 crontab 任务,每个任务以创建者的名字命名(如 root ) 1.png 我们可以在命令行输入: crontab -e 然后添加相应的任务,wq 存盘退出。

    • crontab -e 为添加任务
    • crontab -l 为查看任务
    • service cron status 为查看定时任务状态
    • service cron start 为启动 cron 服务(docker 中默认不开启)
    • service cron stop 为关闭 cron 服务
    • service cron reload 为加载 cron 任务
    • service cron restart 为重启 cron 服务
  2. /etc/crontab 这个文件负责调度各种管理和维护任务(*/10 * * * *表示10分钟执行一次) 2.png 我们可以直接编辑/etc/crontab 文件,即 vi /etc/crontab,添加相应的任务

  3. 参考