站内公告:

我们的虚拟社区正式开通了

Main Menu

最新帖子

#71
Ubuntu / ubuntu缺少public-key问题
上次发布者 jvip_chen - 2022-4月-18 04:57 下午
在给ubuntu软件源中添加新的item后,可能在再行软件库更新操作时,会出现缺少public key问题,可通过如下解决:

Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 2EA8F35793D8809A
然后执行

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 2EA8F35793D8809A
#72
Linux 系统 / awk多分隔符
上次发布者 jvip_chen - 2022-4月-14 04:43 下午
awk的-F参数可以指定新的分隔符,有些时候可能需求指定多个分隔符,比如下面的内容

[root@N1 ~]# netstat -an | grep ESTAB
udp        0      0 192.168.1.120:35570     212.47.249.141:123      ESTABLISHED
udp        0      0 192.168.1.120:55589     108.59.2.24:123         ESTABLISHED
如果需要取出源IP的话,一般大家会这样做,即做两次awk操作

[root@N1 ~]# netstat -an | grep ESTAB | awk  '{print $5}' | awk -F: '{print $1}'
108.59.2.24
212.47.249.141
其实呢,通过在awk中指定两个分隔符(空格和:),即可一次性的提取出源IP地址,在awk中支持多个分隔符的写法如下:

[root@N1 ~]# netstat -an | grep ESTAB | awk -F '[ :]+' '{print $6}'
108.59.2.24
212.47.249.141
#多一个加号表明将连续出现的分隔符当做一个来处理
#73
Linux 系统 / awk 的分隔符
上次发布者 jvip_chen - 2022-4月-14 04:04 下午
awk 分隔符的使用:

1.awk -F分隔符

2.是用分隔符变量 awk -v FS='分隔符'

3.输出分隔符变量 awk -v OFS='分隔符'

4.输出变量用','分割后将割开显示  awk '{print $1,$2}'

5.输出变量用' '分割后将连接显示 awk '{print $1 $2}'

LM-SHC-16507744:Desktop yanwxu$ cat testd
123#ruby#3#abc
456#rechel#25#def
789#wang#30#ghi
LM-SHC-16507744:Desktop yanwxu$ awk -F# '{print $1,$2}' testd
123 ruby
456 rechel
789 wang
LM-SHC-16507744:Desktop yanwxu$ awk -v FS='#' '{print $1,$2}' testd
123 ruby
456 rechel
789 wang
LM-SHC-16507744:Desktop yanwxu$ awk -v FS='#' OFS='+++++' '{print $1,$2}' testd
awk: syntax error at source line 1
 context is
>>> OFS=++++ <<<
awk: bailing out at source line 1
LM-SHC-16507744:Desktop yanwxu$ awk -v FS='#' -v OFS='+++++' '{print $1,$2}' testd
123+++++ruby
456+++++rechel
789+++++wang
LM-SHC-16507744:Desktop yanwxu$ awk -F# '{print $1,$2}' testd
123 ruby
456 rechel
789 wang
LM-SHC-16507744:Desktop yanwxu$ awk -F# '{print $1  $2}' testd
123ruby
456rechel
789wang
#74
python3 开发 / python sort 和sorted 区别
上次发布者 jvip_chen - 2022-4月-13 09:39 上午
sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

1.字典根据键从小到大排序
dict = {"name": "zs", "age": 18, "city": "深圳", "tel": "1362626627"}

res = sorted(dict.items(), key=lambda x: x[0], reverse=False)

print(res)
new_dict = {}
for x in res:
    new_dict[x[0]] = x[1]

print(new_dict)
2. 字典排序方式二
foo = [{"name": "zs", "age": 19}, {"name": "ll", "age": 54},

       {"name": "wa", "age": 17}, {"name": "df", "age": 23}]

# 列表嵌套字典的排序,分别根据年龄和姓名排序
res = sorted(foo, key=lambda x: x["name"], reverse=False)

print(res)
3.元组排序

foo = [("zs", 19), ("ab", 2), ("t", 8)]
res = sorted(foo, key=lambda x: x[0], reverse=False)
print(res)
#75
python3 开发 / SQLAlchemy快速更新或插入对象
上次发布者 jvip_chen - 2022-4月-10 08:29 下午
写脚本刷数据的时候,常常有这样的需求:如果对象存在,那么更新数据,否则,插入数据。 有可能数据源的数据比schema的字段更多,这种时候,就需要想办法把SQLAlchemy中的schema字段取出来, 只取需要的字段了。假设我们的schema叫做 User:

valid_columns = set(User.__table__.columns.keys())  # 获取model中定义的columns
这样就能获取到合法的schema字段,然后我们把数据源的数据过滤:

valid_attrs = {k: v for k, v in i.items() if k in valid_columns}
如果其中有需要单独处理的字段,我们进行特殊处理:

adjust_time(valid_attrs)


def adjust_time(attrs):
    # mongo存储的是毫秒时间戳
    attrs["created_at"] = datetime.datetime.fromtimestamp(attrs["created_at"] / 1000.0)
    attrs["updated_at"] = datetime.datetime.fromtimestamp(attrs["updated_at"] / 1000.0)
    if attrs.get("deleted_at"):
        attrs["deleted_at"] = datetime.datetime.fromtimestamp(attrs["deleted_at"] / 1000.0)
之后我们就可以愉快的对SQLAlchemy对象进行更新或者插入了:

already_exist = User.get_by_id(s, i["user_id"])
if already_exist:
    logging.info("update item: %s", i)
    User.update_by_user_id(s, already_exist.user_id, valid_attrs)
else:
    logging.info("insert item: %s", i)
    s.add(User(**valid_attrs))
其中,model中的 update_by_user_id定义如下:

@classmethod
def update_by_user_id(cls, session, user_id, attr_map):
    session.query(cls).filter(cls.user_id == user_id).update(attr_map)
搞定!
#76
python3 开发 / sqlalchemy更新和插入操作
上次发布者 jvip_chen - 2022-4月-10 08:28 下午
def save_app_info(self):
        try:
            # update app_info
            print(self.dicts)
            data = db_session.query(App_Info).filter_by(app_id=self.app_id,mall_name=self.mall_name).first()
            if data:   
                {setattr(data, k, v) for k,v in dicts.items()}
                print(data)
            else:
                # insert app_info
                db_session.execute(App_Info.__table__.insert(), self.dicts)
            db_session.commit()
        except:
            db_session.rollback()
            other.error("save app_data is error,here are details:{}".format(traceback.format_exc()))
        finally:
            db_session.close()
#77
python3 开发 / SQLAlchemy insert 和 update
上次发布者 jvip_chen - 2022-4月-10 08:25 下午
在SQLAlchemy,update和insert的写法很像,但是又有区别,下面看看代码:

insert操作代码:

msg_count = db.session.query(sqlalchemy.func.count(SMS_Receive.id))\
            .filter(and_(SMS_Receive.IsShow == True, SMS_Receive.PhoneNumber_id == number))\
            .scalar()
sms_count_info = SMSCount(PhoneNumber_id=number, SMS_Count=msg_count)
db.session.add(sms_count_info)
db.session.commit()
之后是update代码:

get_sms_count = SMSCount.query.filter_by(PhoneNumber_id=number).first()
get_sms_count.SMS_Count+=1
get_sms_count.PhoneNumber_id=number
db.session.commit()
可以看到在insert里面先加入到session里面才提交,而insert则是先查询出来之后更新才提交。

看看stack overflow上面的update一些回答写法:

admin = User.query.filter_by(username='admin').first()
admin.email = 'my_new_email@example.com'
db.session.commit()

user = User.query.get(5)
user.name = 'New Name'
db.session.commit()
#78
CentOs / CentOS8解决“Failed to download m...
上次发布者 jvip_chen - 2022-1月-28 05:37 下午
在CentOS8上执行下面命令时报错

yum install epel-release
CentOS Linux 8 - AppStream                       23  B/s |  38  B     00:01   
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

原因
在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS 8的所有包。

CentOS 8已于2021年12月31日寿终正寝,但软件包仍在官方镜像上保留了一段时间。现在他们被转移到https://vault.centos.org

解决方法�
如果你仍然需要运行你的旧CentOS 8,你可以在/etc/yum.repos中更新repos.d使用vault.centos.org代替mirror.centos.org。

cd /etc/yum.repos.d
vi CentOS-Linux-BaseOS.repo
vi CentOS-Linux-AppStream.repo
[baseos]
name=CentOS Linux $releasever - BaseOS
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
baseurl=https://vault.centos.org/centos/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[appstream]
name=CentOS Linux $releasever - AppStream
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
baseurl=https://vault.centos.org/centos/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
#79
Tracker 是 Linux 的文件索引和搜索工具。 Gnome 将其用于某些功能,因此,默认情况下,Tracker 安装在许多 Linux 发行版上。

该工具可加快搜索速度并在"文件"应用程序中启用全文搜索,使基于元数据的批量重命名功能在"文件"应用程序中工作,并在"活动概览"中启用文件和文件夹搜索。 有一些 GNOME 应用程序也依赖于它(没有它就不能工作),比如音乐或照片。
如果没有 Tracker,您将失去这些功能,因此在完全禁用 Tracker 之前要考虑到这一点。

虽然它为 GNOME 桌面带来了许多有用的功能,但在某些情况下,Tracker 也会对性能产生影响。 这些性能问题据称已得到修复,现在甚至在 Ubuntu 19.04、19.10 和 20.04 中默认安装了 Tracker(在旧版本中默认不安装,例如 Ubuntu 18.04)。 但是仍然有用户遇到 Tracker 的性能问题,或者用户认为它过于占用资源。

那些不想使用Tracker的人在大多数情况下无法删除该应用程序,因为其他包依赖于它
. 这是来自 Ubuntu 19.04 的示例:

$ sudo apt remove tracker tracker-extract tracker-miner-fs

Reading package lists... Done
Building dependency tree     
Reading state information... Done
The following packages were automatically installed and are no longer required:
  gir1.2-clutter-gst-3.0 gir1.2-evince-3.0 libgsf-1-114 libgsf-1-common libmusicbrainz5-2
  libtagc0
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  gnome-shell-extension-desktop-icons gnome-sushi insync-nautilus nautilus
  nautilus-mediainfo nautilus-share tracker tracker-extract tracker-miner-fs ubuntu-desktop
  ubuntu-desktop-minimal
0 upgraded, 0 newly installed, 11 to remove and 0 not upgraded.
After this operation, 5,517 kB disk space will be freed.
Do you want to continue? [Y/n]
因此,尝试在 Ubuntu 19.04 上删除 Tracker 会导致 Nautilus、桌面图标扩展和 ubuntu-desktop 元包被删除。 在 Fedora 另一方面,默认安装了更多的 Gnome 软件,删除 Tracker 也想删除 Gnome Boxes、Documents、Photos 和 Totem,以及其他 134 个包。

在 Gnome 桌面上禁用 Tracker 的官方方法是去 Settings -> Search,然后从搜索设置标题栏(窗口顶部)关闭开关。 然而,有用户声称这不会禁用它
,所以我决定尝试一下,在关闭此选项并重新启动系统后,
tracker status
声称它的索引中有超过 100000 个文件,并且它目前正在索引文件。 但是如果您愿意,您可以尝试一下,看看它是否对您的系统有任何影响。

我已经用禁用(和撤销更改)Tracker 3 的说明更新了这篇文章,它是随 GNOME 3.38 一起发布的。 请注意,并非所有使用 GNOME 3.38 和更新版本的 Linux 发行版都使用 Tracker 3 – 例如 Ubuntu 20.10 和 21.04 都使用 GNOME 3.38 但使用 Tracker 2; Fedora 例如 34,使用 GNOME 40 和 Tracker 3。

那么如何完全禁用 Tracker,使其不再索引任何文件,并停止在后台运行任何 Tracker 进程? 您可以使用以下命令屏蔽 Tracker systemd 服务以完全为当前用户禁用它:

对于跟踪器 2:
systemctl --user mask tracker-store.service tracker-miner-fs.service tracker-miner-rss.service tracker-extract.service tracker-miner-apps.service tracker-writeback.service
对于追踪器 3:
systemctl --user mask tracker-extract-3.service tracker-miner-fs-3.service tracker-miner-rss-3.service tracker-writeback-3.service tracker-xdg-portal-3.service tracker-miner-fs-control-3.service
在此之后,重置跟踪器:

对于跟踪器 2:
tracker reset --hard
对于追踪器 3:
tracker3 reset -s -r
并重新启动。

如果您在屏蔽 Tracker 服务后重新启动系统,您应该不会再看到任何在后台运行的 Tracker 进程。 或者跑 tracker status (对于Tracker3,运行 tracker3 status) 并且它不应该工作,说该单元被屏蔽(这仅在您同时使用屏蔽和跟踪器重置命令时才会发生)。 你也可以运行 tracker daemon (对于跟踪器 3,运行 tracker3 daemon) 检查 Tracker 守护进程(Tracker Store 和 Tracker Miners)的状态——它们都应该被列为禁用/未运行:


您可能会收到一条警告,指出其中一些服务不存在 – 忽略它。 那是因为例如在 Ubuntu 19.04 上没有 tracker-miner-rss.service 默认情况下,但在 Solus OS 上有一个 Fedora,这反过来又没有 tracker-miner-apps.service.

当屏蔽一个 systemd 服务时,它的单元文件被符号链接到 /dev/null,即使其他服务尝试加载它,也无法加载该服务。 这比禁用服务要好,因为禁用后,如果启动了另一个依赖于它的服务,该服务可能仍会启动。

想要撤消此更改并重新启用 Tracker? 利用:

对于跟踪器 2:
systemctl --user unmask tracker-store.service tracker-miner-fs.service tracker-miner-rss.service tracker-extract.service tracker-miner-apps.service tracker-writeback.service
对于追踪器 3:
systemctl --user unmask tracker-extract-3.service tracker-miner-fs-3.service tracker-miner-rss-3.service tracker-writeback-3.service tracker-xdg-portal-3.service tracker-miner-fs-control-3.service
并在此之后重新启动您的系统.
#80
Linux 系统 / Linux crontab 命令
上次发布者 jvip_chen - 2022-1月-15 09:07 上午
Linux crontab是用来定期执行程序的命令。

当安装完成操作系统之后,默认便会启动此任务调度命令。

crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。

而 linux 任务调度的工作主要分为以下两类:

1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
语法
crontab [ -u user ] file

crontab [ -u user ] { -l | -r | -e }
说明:

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。

-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

参数说明:

-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r : 删除目前的时程表
-l : 列出目前的时程表
时间格式如下:

f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12)
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
使用者也可以将所有的设定先存放在文件中,用 crontab file 的方式来设定执行时间。

实例
每一分钟执行一次 /bin/ls:
* * * * * /bin/ls
在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup:
0 6-12/3 * 12 * /usr/bin/backup
周一到周五每天下午 5:00 寄一封信给 alex@domain.name:
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha":
20 0-23/2 * * * echo "haha"
下面再看看几个具体的例子:
0 */2 * * * /sbin/service httpd restart  意思是每两个小时重启一次apache
50 7 * * * /sbin/service sshd start  意思是每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop  意思是每天22:50关闭ssh服务
0 0 1,15 * * fsck /home  每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup  每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;  每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30执行一次ls命令
注意:当程序在你所指定的时间执行后,系统会发一封邮件给当前的用户,显示该程序执行的内容,若是你不希望收到这样的邮件,请在每一行空一格之后加上 > /dev/null 2>&1 即可,如:
20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh > /dev/null 2>&1
脚本无法执行问题
如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。

解决方法:

1、所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。
2、在 shell 脚本开头使用以下代码:
#!/bin/sh

. /etc/profile
. ~/.bash_profile
3、在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:
20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh