centos7 升级 glibc2.25 踩坑记录

目录

1 基础环境准备

1.1 make升级

1.2 gcc升级

2 升级glibc

3 注意事项

4 故障处理

        centos7默认的glibc函数库的版本为2.17,无法运行一些对glibc版本有要求的中间件。为了在centos7上可以正常运行此类中间件,则需要对glibc进行升级。

假设需要安装一个中间件,该版本的中间件要求glibc函数库在2.25以上,但操作系统的glibc版本为2.17,为了符合运行要求需要对glibc进行升级。由于直接升级到glibc2.25会出现各种崩溃的问题(如:无法远程、常规基础命令无法使用等等)。经反复测试确认,可直接升级到glibc2.31(升级过程中会自动安装缺失的版本)。

1 基础环境准备

        说明:升级之前最好保持两个以上的远程终端,防止升级失败时手误关闭了终端导致无法再远程!

升级glibc2.31前需要确保基础环境满足以下条件:gcc版本要在9以上(默认4.8.5),make版本要在4.0以上(默认3.82)。

执行以下操作前需远程登录到目标服务器

1.1 make升级

升级前需确认当前环境的make版本(make -v),若当前版本为3.x则确认本次需升级,若为4.x则跳过此步骤。假设当前环境的make为3.x,需要进行make升级。

至此 make升级完成。

1.2 gcc升级

升级前需确认当前环境的gcc版本(gcc -v),若当前版本为4.x则确认本次需升级,若为9.x则跳过此步骤。假设当前环境的gcc为4.x,需要进行gcc升级。

至此 gcc升级完成。

2 升级glibc

升级前需查看当前环境的glibc是否存在符合taos3的版本,若存在则跳过升级,此文档假设glibc当前最高的版本为2.17

至此 glibc升级完成。

3 注意事项

1.升级glibc存在系统崩溃风险!!!升级前尽可能在个人环境下进行反复测试,确保无问题后再升级生产环境!

2.当glibc版本为2.17时千万不要直接升级到2.25!!!2.17与2.25直接差4个版本(2.18、2.22、2.23、2.24),经反复测试确认发现直接升级到2.25时不会自动安装缺失的版本,而2.25又对之前的版本有依赖(个人猜测),强行安装2.25不但安装失败,且会造成系统崩溃、异常(比如无法使用ls、cp等命令,无法进行远程连接)。

4 故障处理

        故障现象:假设在glibc2.17时直接升级到glibc2.25,将会出现操作系统崩溃的情况,如:大部分命令不可用、无法远程登录、yum报错等。

        说明:出现此类问题时千万不要重启服务器,不要关闭当前的终端!!!

        故障原因:glibc2.25未编译安装成功,但部分组件依赖的函数库软链接指向到了glibc2.25上。

        解决办法:将软链接指向原glibc-2.17

发表在 系统分类 | 留下评论

zerotier充当网关实现内网互联,访问其它节点内网

本节知识点:建议学习和理解并掌握iptables/route运行原理和机制.

一、网络三层NAT配置方法(linux主机)[推荐]

  • 假设zerotier虚拟局域网的网段是192.168.88.0 局域网A 192.168.1.0 局域网B 192.168.2.0
  • (如果需要互联)在局域网A和B中需要各有一台主机安装zerotier并作为两个内网互联的网关
  • 分别是192.168.1.10(192.168.88.10) 192.168.2.10(192.168.88.20)#括号里面为虚拟局域网的IP地址

1.在zerotier网站的networks里面的Managed Routes下配置路由表,增加如下内容

2.开启内核转发

3.防火墙设置

二、网络二层桥接方式(linux主机)[未测试,谨慎尝试!]

1.设置桥接

在官网的networks里面,在Members选择两个节点前面的小扳手,然后勾选Allow Ethernet Bridging

2.配置网桥模式

请注意,如果你的设备仅有一个物理网卡,下方配置可能会断网噢.
配置桥接前,请先清空物理网卡的ip,否则会影响路由出口选择.

致谢

发表在 应用工具软件 | 标签为 , | 留下评论

LINUX下S3FS方式挂载七牛

首先需要安装s3fs,安装方式可参考官方文档,这里以centos为例

将七牛AK/SK 写入**文件,比如 /root/.passwd-s3fs,并将**文件权限设为600

将已经存在的bucket挂载到本地目录,url填写七牛s3的服务域名

此处注意,网上很多写的是s3fs bucketname,但使用bucketname根本不好用。s3域名可以在空间概览中看到

使用 df -h 使命可以看到挂载情况

如果挂载不成功可以使用下面命令查看错误

 

发表在 操作系统相关 | 标签为 , | 留下评论

docker安装部署elasticsearch8.1.1

配置系统

安装服务启动服务

启动有可能会报各种错误,我这里遇到(如果没遇到跳过这一段)

参考 https://github.com/elastic/elasticsearch/issues/85463

我这里处理方法是
启动不要挂载

配置文件是这样的

其实也没操作什么就可以使用了,配置文件依旧是前面配置的(不要保留有改变,不要保留xpack.security的配置)

 

发表在 应用工具软件 | 标签为 , | 留下评论

esptool.py 介绍和使用

一: esptool.py 简介

esptool.py 是乐鑫提供的开源库工具,用于乐鑫 ESP8285, ESP8266, ESP32, ESP32-S等系列芯片和 ROM Bootloader(即:一级 bootloader)通讯,从而实现:

固件烧录flash 擦除flash 读取读 MAC 地址读 flash idelf 文件转 bin 等常用功能;

flash 校验, 读取内存载入 bin 到 RAM 执行读内存写内存读 flash 状态写 flash 状态读 chip id组装 bin等高级功能。

esptool.py 原版介绍请参考README.md
esptool.py 串口协议请参考 Serial Protocol
esptool.py 更多资料请参考 esptool.py WiKi


二: 安装方法

[推荐] 安装方法一 (功能实时更新)

1. 下载 esptool.py 源码

2. 目录导入到全局环境变量
ubuntu 为例:

  • export PATH=/home/chenwu/esp/esptool:$PATH 添加到 /etc/profile 文件结尾
  • 执行 source /etc/profile

安装成功后通过 esptool.py version 查看版本:

注意: esptool.py v3.0 版本后,才对 ESP32-S 系列支持。
如果使用新款芯片,可以通过 git pull 来更新 esptool.py 版本。

安装方法二:(安装简单)

如下 shell 命令任选其一,执行成功即可:
pip install esptool
python -m pip install esptool
pip2 install esptool


三: esptool.py 说明

  • 当前支持命令: load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version,get_security_info
  • 通过 esptool.py -h 查看所有命令和通用参数详细说明
  • 通过 esptool.py <command> -h 查看每条命令对应的参数详细说明

通用参数说明 (命令前参数)

  • -h: 或 --help, 显示帮助文档
  • --chip: 或 -c, 指定芯片,可选 auto,esp8266,esp32,esp32s2
  • --port: 或 -p, 指定串口
  • --baud: 或 -b, 指定波特率
  • --before: 指定 esptool.py 命令执行前预做的,可选 default_reset,no_reset,no_reset_no_sync,具体参考文档
  • --after: 或 -a, 指定 esptool.py 命令执行后将做的,可选 hard_reset,soft_reset,no_reset,具体参考文档
  • --no-stub: 禁用 Boot Stub, 不让其管理 flash 操作,具体参考文档
  • --trace: 或 -t, 打开 esptool.py 所有交互细节
  • --override-vddsdio: VDDSDIO 内部电压调节
  • --connect-attempts: 指定 esptool.py 尝试连接次数,默认 7.

四: 常用命令

1. 固件烧录 – write_flash

命令参数说明:

  • --erase-all: 或 -e, 在写固件时,擦除所有 flash 上所有 sector(默认只擦除要写区域的 sector)
  • --flash_freq: 或 -ff, 可选 keep,40m,26m,20m,80m, 指定 SPI 速率
  • --flash_mode:或 -fm, 可选 keep,qio,qout,dio,dout, 指定 SPI 模式
  • --flash_size:或 -fs. 可选 1MB, 2MB, 4MB, 8MB, 16M + ESP8266 上特有的 256KB, 512KB, 2MB-c1, 4MB-c1。 指定 flash 大小
  • --spi-connection:或 -sc, 指定 ESP32 SPI/HSPI 连接配置,具体参考文档
  • --no-progress: 或 -p, 禁用进度条打印
  • --verify: 在 flash 上验证刚刚写入的数据
  • --encrypt: 写入数据时应用 flash 加密(需要正确的 efuse 设置)
  • --ignore-flash-encryption-efuse-setting:忽略 flash 加密的 efuse 设置
  • --compress: 传输中压缩数据(默认 –no-stub 未指定)
  • --no-compress:传输中禁用压缩数据(默认 –no-stub 已指定)

命令参考用法:
esptool.py write_flash [-h][--erase-all][--flash_freq {keep,40m,26m,20m,80m}][--flash_mode {keep,qio,qout,dio,dout}][--flash_size FLASH_SIZE][--spi-connection SPI_CONNECTION] [--no-progress][--verify] [--encrypt][--ignore-flash-encryption-efuse-setting][--compress | --no-compress]<address> <filename> [<address> <filename> ...]

示例一:自动烧录
向 flash 的 0x0 地址烧录 factory.bin 文件

示例二:指定全参数烧录
指定芯片 ESP8266, 串口 USB0, flash DIO 模式, 80MHz, flash 为 2MB, 0x0 地址烧录 bootloader.bin, 0x10000 地址烧录 sntp.bin, 0x8000 地址烧录 partitions.bin

2. flash 读取 – read_flash

命令参数说明:

  • --spi-connection:或 -sc, 指定 ESP32 SPI/HSPI 连接配置,具体参考文档
  • --no-progress: 或 -p, 禁用进度条打印

命令参考用法:
esptool.py read_flash [-h] [--spi-connection SPI_CONNECTION][--no-progress] address size filename

示例一:自动读取
读取从 0x0 地址开始的 4KB 内容,保存到 dump.bin 文件

示例二: 指定参数读取
指定串口 USB1, 波特率 460800, 从 0x10000 地址读取 1MB 内容到 dump.bin 文件

3. flash 擦除 – erase_flash & erase region

命令参数说明:

  • --spi-connection:或 -sc, 指定 ESP32 SPI/HSPI 连接配置,具体参考文档

命令参考用法:
esptool erase_flash [-h] [--spi-connection SPI_CONNECTION]
esptool erase_region [-h] [--spi-connection SPI_CONNECTION] address size

示例一:自动擦除
擦除 flash 上所有内容,即所有数据将是 0xFF

示例二: 擦除指定区域
擦除从 0x20000 地址开始的 16KB 空间

4. 读 MAC 地址 – read_mac

无命令参数

命令参考用法:

通常设备有多个 MAC 地址,例如做 station 的 MAC 地址,做 softAP 时的 MAC 地址,etc
这里读取的是 MAC 地址是 station 地址

5. 读 flash id – flash_id

命令参数说明:

  • --spi-connection:或 -sc, 指定 ESP32 SPI/HSPI 连接配置,具体参考文档

命令参考用法:
esptool.py flash_id [-h] [--spi-connection SPI_CONNECTION]

示例:读取 flash id

结果将有如下厂商信息和设备信息:

可在厂商和设备信息中 具体查看

6. elf 文件转 bin – elf2image

命令参数说明:

  • --output: 或 -o, 输出文件名前缀(image version=1)或文件名(image version=2)
  • --version: 或 -e, 可选 1,2, 输出的 image version
  • --min-rev: 或 -r, 可选 0,1,2,3, 最小芯片修正
  • --secure-pad: 填充 image,因为一旦签名,它将以 64KB 的边界结束。(适用于安全引导v1映像)
  • --secure-pad-v2: 将 image 填充到 64KB,因为一旦签名,其签名扇区将在下一个 64K block开始。(适用于安全引导v2映像)
  • --elf-sha256-offset:如果已设置,请在二进制文件的指定偏移量处插入输入ELF文件的 SHA256 哈希(32字节)
  • --flash_freq: 或 -ff, 可选 keep,40m,26m,20m,80m, 指定 SPI 速率
  • --flash_mode:或 -fm, 可选 keep,qio,qout,dio,dout, 指定 SPI 模式
  • --flash_size:或 -fs. 可选 1MB, 2MB, 4MB, 8MB, 16M + ESP8266 上特有的 256KB, 512KB, 2MB-c1, 4MB-c1。 指定 flash 大小
  • --spi-connection:或 -sc, 指定 ESP32 SPI/HSPI 连接配置,具体参考文档

命令参考用法:
esptool elf2image [-h] [--output OUTPUT] [--version {1,2}][--min-rev {0,1,2,3}] [--secure-pad][--secure-pad-v2][--elf-sha256-offset ELF_SHA256_OFFSET][--flash_freq {40m,26m,20m,80m}][--flash_mode {qio,qout,dio,dout}][--flash_size FLASH_SIZE][--spi-connection SPI_CONNECTION] input

示例一:
ESP8266 上将 elf 文件转为可执行的 bin 文件

示例二:
ESP8266 上将 elf 文件转为可执行的 bin 文件,指定 image version 为 2

示例三:
ESP32 上将 elf 文件转为可执行的 bin 文件

7. 输出 bin 信息 – image_info

无命令参数

命令参考用法:
esptool image_info [-h] filename

示例一:
ESP8266 上输出 image 信息

示例二:
ESP32 上输出 image 信息

五: 高级命令

1. flash 校验 – verify_flash

详细说明 参考文档

命令参数说明:

  • --diff: 或 -d, 可选 yes,no, 显示不同
  • --flash_freq: 或 -ff, 可选 keep,40m,26m,20m,80m, 指定 SPI 速率
  • --flash_mode:或 -fm, 可选 keep,qio,qout,dio,dout, 指定 SPI 模式
  • --flash_size:或 -fs. 可选 1MB, 2MB, 4MB, 8MB, 16M + ESP8266 上特有的 256KB, 512KB, 2MB-c1, 4MB-c1。 指定 flash 大小
  • --spi-connection:或 -sc, 指定 ESP32 SPI/HSPI 连接配置,具体参考文档

命令参考用法:
esptool verify_flash [-h] [--diff {no,yes}][--flash_freq {keep,40m,26m,20m,80m}][--flash_mode {keep,qio,qout,dio,dout}][--flash_size FLASH_SIZE][--spi-connection SPI_CONNECTION] addr_filename [addr_filename ...]

示例:
对比 flash 上 0x10000 位置的 bin 和 build/sntp.bin 是否相等

2. 读取内存 – dump_mem

详细说明 参考文档

无命令参数

命令参考用法:
esptool.py dump_mem [-h] address size filename

示例:
读取 ESP82660x40000000 内存地址开始的 4KB 内容,保存到 iram0.bin

3. 载入 bin 到 RAM 执行 – load_ram

详细说明 参考文档

无命令参数

命令参考用法:
esptool load_ram [-h] filename

示例:
ESP8266 可执行的 image 加载到 ram 中,然后立即执行其中包含的程序

4. 读内存 – read_mem

详细说明 参考文档 无命令参数 命令参考用法: esptool.py read_mem [-h] address

示例: 读取 ESP8266 上内存地址为 0x400C0000 中的值 (4字节)

5. 写内存 – write_mem

详细说明 参考文档

无命令参数

命令参考用法:
esptool write_mem [-h] address value mask

示例:
0x400C0000 地址写入 0xabad1dea

6. 读 flash 状态 – read_flash_status

详细说明 参考文档

命令参数说明:

  • --bytes: 可选 1,2,3, 要读的字节数
  • --spi-connection:或 -sc, 指定 ESP32 SPI/HSPI 连接配置,具体参考文档命令参考用法:

esptool read_flash_status [-h] [--spi-connection SPI_CONNECTION][--bytes {1,2,3}]

示例:

7. 写 flash 状态 – write_flash_status

详细说明 参考文档

命令参数说明:

  • --bytes: 可选 1,2,3, 要读的字节数
  • --spi-connection:或 -sc, 指定 ESP32 SPI/HSPI 连接配置,具体参考文档
  • --non-volatile: 写入非易失位

命令参考用法:
esptool write_flash_status [-h] [--spi-connection SPI_CONNECTION][--non-volatile] [--bytes {1,2,3}] value

示例:

8.读 chip id – chip_id

详细说明 参考文档

无命令参数

命令参考用法:
esptool chip_id [-h]

示例:

9. 组装 bin – make_image

详细说明 参考文档 命令参数说明:

    • --segfile: 或 -f, 输入的 segment 文件
    • --segaddr: 或 -a, segment 基地址
    • --entrypoint: 或 -e, 入口地址

命令参考用法: esptool make_image [-h] [--segfile SEGFILE] [--segaddr SEGADDR][--entrypoint ENTRYPOINT] output 示例:

10. 退出 boot, 执行 app – run

详细说明 参考文档

无命令参数

命令参考用法:
esptool run [-h]

示例:

发表在 应用工具软件 | 标签为 | 留下评论

宝塔的WebHook+Gitee配置自动拉取远程仓库代码

宝塔webhook对接 码云 自动 pull

一.   准备工作

码云申请账号,建立仓库

服务器安装宝塔,GIT和webhook

二.

1.服务器安装 GIT

2.宝塔安装 webhook插件

3.添加脚本

注意:

其中 “$1”是参数,是你码云仓库的名称,脚本内容大致是:”收到通信后,去指定的地方拉取master的分支代码

发表在 系统分类 | 标签为 , | 留下评论

使用VirtualBox安装Ubuntu界面显示不全的解决办法

今天初次用VirtualBox安装Ubuntu的时候,结果出现“Ubuntu界面显示不全”的问题,不管如何调整都不能完整显示出来,造成了使用VirtualBox安装Ubuntu时出现了界面中不显示完整窗口导致按钮隐藏无法点击的问题。如下图:

原因:

主要的原因是分辨率预设错误导致窗口显示不完整,而由于系统未完成安装,无法使用VirtualBox调整窗口分辨率。更加不用说使用VirtualBox“安装增强功能”了。

解决方法:

1、按住键盘上的Alt键+鼠标左键拖动弹出窗口直至显示需要点击的按钮。

2、如果用Alt键不生效,请用“win”键+鼠标左键拖拽。win键就是我们常用的:win+r 快捷键的那个图标。

3、同时按下ctrl+alt+t 呼出shell,然后xrandr 可以设置分辨率。

最终效果如下图:

发表在 应用工具软件, 操作系统相关 | 标签为 , | 留下评论

用supervisor守护php-fpm主进程来实现php-fpm的自动重启

最近有个针对php-fpm进程的监护需求,也即:如果php-fpm的master进程意外退出(可能是crash,也可能是被误kill),那么希望master进程能被自动拉起,以免中断服务。

我们知道,supervisor是一个非常强大的进程监控(monitor & control)工具,它理论上可以实现php-fpm master进程的守护需求。因此,我试验了如何用supervisor完成这个需求,结果表明,supervisor确实是神器,只需一个合理的配置文件,它就能解决问题。

下面是我的调研过程及最终实现php-fpm主进程守护功能的配置文件,在此做个记录,也希望能帮助到别人。

1. 安装supervisor

supervisor本身是python实现的,而且是调研阶段,故先创建一个新的virtualenv环境,然后用pip安装好supervisor包。

至此,基本的调研环境搭建完毕。当然,php-fpm和PHP环境以及前端的Nginx是早就ready的。

2. 分析php-fpm.sh脚本

通常编译安装PHP后,php-fpm这个2进制的C程序也会被编译并安装好,典型路径在php_install_path/sbin/目录下。该目录下还有个名为php-fpm.sh的脚本用于控制php-fpm进程的start/stop/restart/reload等动作。

./sbin/php-fpm.sh脚本中,”start”操作启动了php-fpm主进程,其余的操作都是通过向php-fpm master进程发signal实现的。

从上面是终端输入”./sbin/php-fpm.sh start”时,实际执行的代码,可以看到,php-fpm进程的启动参数是–daemonize $php_opts,而$php_opts的值为”–fpm-config $php_fpm_CONF –pid $php_fpm_PID”。

注意: php-fpm.sh启动php-fpm master进程时,传入了daemonize参数,表明php-fpm master process以守护(daemon)方式启动,而根据supervisor文档的说明,当用supervisor监护进程时,被监护进程不能是守护进程,这是由于守护进程通常会在fork完子进程后就让父进程”结束生命”,也即由supervisor创建的父进程退出,此时,supervisor无法再监护已退出进程创建出来的子进程。关于daemon process的行为,可以参考Linux Daemon Writing HOWTO一文来理解。

根据上面的分析,我们知道,只要supervisor启动php-fpm进程时,后者不以daemon方式启动即可。这需要两个动作来完成(假设已cd至PHP安装目录):
1)编辑./etc/php-fpm.conf,设置daemonize = no,默认是yes
2)在supervisor的配置文件中,设置’command’对php-fpm主进程的调起参数时,不传入–daemonize参数。

3. 实现php-fpm主进程守护功能的supervisor配置文件

上面的分析已经告诉我们应该怎么解决问题了,下面直接上验证可用的配置文件。文件位于php-fpm.conf同级目录下(典型路径为php_install_path/etc/)。

配置文件结构通过查看supervisor文档很容易就能掌握,有两个配置项需要特别注意

1) command

它指定了supervisor要监控的进程的启动命令,可以看到,这里我们没有给php-fpm传入daemonize参数,其余参数只是展开了php-fpm.sh中的shell变量而已。

大家已经注意到,command也不是直接调起php-fpm,而是通过bash -c执行了两个命令,而第一个命令是sleep 1。这是由于php-fpm在stop后,其占用的端口通常不能立即释放,此时,supervisor以极快的速度试图重新拉起进程时,可能会由于报如下错误而导致几次retry均失败:

而supervisor目前还不支持delay restart功能,因此,这里只能通过先sleep再启动的略显tricky的方法来解决问题,结果表明,疗效不错且无副作用。

2) autorestart

其文档描述如下:

其默认值是unexpected,表示若被监护进程的exit code异常时,supervisor才会重新拉起进程。这里设置为true,表明任何时候进程退出均会被再次拉起。

这样配置好后,在本文第1步搭建好的virtualenv环境中,运行如下命令即可完成supervisor对php-fpm master进程的监护:

然后,通过ps x | fgrep fpm可以看到,php-fpm主进程已经被拉起了。
然后,kill掉php-fpm主进程,再次ps x | fgrep fpm可以看到,一个新的php-fpm主进程会被supervisor创建出来。

至此,用supervisor守护php-fpm主进程以实现php-fpm的自动重启的需求已经解决了。

参考资料

  1. Supervisor: A Process Control System
  2. Linux Daemon Writing HOWTO
发表在 CS架构后台语言, 应用工具软件 | 标签为 , | 留下评论

mac brew 国内源配置

alias vcpkg=”/Users/icezhang/Desktop/vcpkg-master/vcpkg”

alias python=”/usr/local/bin/python3″

alias idf=’. $HOME/esp/esp-idf/export.sh’

一、自动脚本(全部国内地址)(在终端中复制粘贴回车下面脚本)

苹果电脑 常规安装脚本(推荐 完全体 几分钟安装完成):

苹果电脑 极速安装脚本(精简版 几秒钟安装完成):

苹果电脑 卸载脚本:

Linux电脑 安装脚本:

Linux电脑 卸载脚本:

成功的话,如上图所示。

二、常见错误说明

Mac 10.11系统版本以下的(包括10.11),brew官方已经停止对这类老系统的支持。

1、first run: git -C xxxxxxx 等类似语句。

有可能废纸篓有之前自己删除的brew文件夹,清空一下。

如果还有这种提示,把报错中提供的解决语句(git -C ….)逐句运行一般就可以解决。

2、如果遇到报错中含有errno 54 / 443 / 的问题:

这种一般切换源以后没有问题,因为都是公益服务器,不稳定性很大。

3、检测到你不是最新系统,需要自动升级Ruby后失败的:

如果还失败运行下面文章的脚本。

金牛肖马:如何升级Mac os自带的Ruby和Gem​zhuanlan.zhihu.com​

4、如果报错 command not found : brew

先运行下面命令看是否能出来Homebrew的版本号(结果看倒数3句)

再运行设置临时PATH的代码:

如果能用就是电脑PATH配置问题,重启终端运行echo $PATH打印出来自己分析一下。

5、如果brew -v没有报错 , brew update出错的:

这种不影响使用,尝试再次运行brew update可能赶上服务器不稳定的一瞬间。

6、brew有一个自检程序,如果有问题自检试试:

提示http://github.com的地址问题不用在意,因为换成国内地址了,所以警告::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::1

7、Error: Running Homebrew as root is extremely dangerous and no longer supported.
As Homebrew does not drop privileges on installation you would be giving all
build scripts full access to your system.

原因是执行过su命令,把账户切换到了root权限,退出root权限即可。
一般关闭终端重新打开即可,或者输入命令exit回车 或者su – 用户名

8、/usr/local/bin/brew: bad interpreter: /bin/bash^M: no such file or directory

如果显示true那就运行下面这句话可以解决:

运行完成后,需要重新运行安装脚本。

9、from /usr/local/Homebrew/Library/Homebrew/brew.rb:23:in `<main>’

10、M1芯片电脑运行which brew如果显示/usr/local/Homebrew/bin/brew

解决方法,运行卸载程序把之前的卸载掉或者手动删除/usr/local目录:

 

发表在 操作系统相关 | 标签为 , | 留下评论

记录libreoffice实现office转pdf(适用于windows、linux)

由于目前的工作跟office打交道比较多,所以才有了此篇blog,需求是实现word转换pdf方便页面展示。之前lz采用的是jacob(仅支持windows)进行转换的,但是现在服务器改成linux显然不能用了,于是网上搜罗一圈,最终决定采用LibreOffice。(前提:需要安装jdk环境)

LibreOffice中文官网:https://zh-cn.libreoffice.org/   下载合适的版本,本文下载的是6.1.6

一:windows下实现office转pdf

安装:直接一键默认安装

环境变量:在path前加入libreoffice安装路径(如:D:\Program Files\LibreOffice\program)

进入dos窗口输入soffice 如果弹出libreoffice界面则表示安装成功

java程序实现转换操作(原理通过cmd调用libreoffice指令)

/**
     * 利用libreOffice将office文档转换成pdf
     * @param inputFile  目标文件地址
     * @param pdfFile    输出文件夹
     * @return
     */
    public static boolean convertOffice2PDF(String inputFile, String pdfFile){
        long start = System.currentTimeMillis();
        String command;
        boolean flag;
        String osName = System.getProperty("os.name");
        if (osName.contains("Windows")) {
            command = "cmd /c start soffice --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile + " --outdir " + pdfFile;
        }else {
            command = "libreoffice --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile + " --outdir " + pdfFile;
        }
        flag = executeLibreOfficeCommand(command);
        long end = System.currentTimeMillis();
        logger.debug("用时:{} ms", end - start);
        return flag;
    }
    /**
     * 执行command指令
     * @param command
     * @return
     */
    public static boolean executeLibreOfficeCommand(String command) {
        logger.info("开始进行转化.......");
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        try {
            logger.debug("convertOffice2PDF cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
//            InputStream errorStream = process.getErrorStream();
//            InputStream inputStream = process.getInputStream();
        } catch (IOException e) {
            logger.error(" convertOffice2PDF {} error", command, e);
            return false;
        }
        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值,返回0表示正常结束
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  convertOffice2PDF {}", command, e);
            return false;
        }
        if (exitStatus != 0) {
            logger.error("convertOffice2PDF cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("convertOffice2PDF cmd exitStatus {}", exitStatus);
        }
        process.destroy(); // 销毁子进程
        logger.info("转化结束.......");
        return true;
    }  

二:Linux下实现office转pdf

安装:把下载下来的三个安装包上传到linux,采用  tar -xvf xxxxxx.tar.gz解压即可

然后进入RPMS包下,采用yum localinstall *.rpm安装rpm文件

测试是否安装成功:libreoffice6.1 -help

为了使用libreoffice创建别名

[root@VM]# alias libreoffice='libreoffice6.0'
[root@VM]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias libreoffice='libreoffice6.0'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'

linux下面命令行测试word转pdf(其参数与windows下的参数大体相同)

命令:libreoffice –convert-to pdf:writer_pdf_Export /usr/lib/files/白头拟稿纸.doc –outdir /usr/lib/files/

关于word转pdf中文乱码问题处理

1:查看fonts目录:cat /etc/fonts/fonts.conf | grep fon
得知字体存放位置:/usr/share/fonts

2: 把Windows下的字体C:\Windows\Fonts下的宋体,即simsun.ttc上传到linux服务器
在fonts下新建Fonts文件 把字体上传到该路径下即可

作者: 不二尘
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
发表在 应用工具软件 | 标签为 | 留下评论