@Author : Lewis Tian ([email protected])
@Link : github.com/taseikyo
@Range : 2021-03-28 - 2021-04-03
本文总字数 2352 个,阅读时长约:4 分 35 秒,统计数据来自:算筹字数统计。
*Photo by Justin W on Unsplash
- algorithm
- 替换文件中的某一行
- review
- 当登录 Windows 时启动 WSL 后台服务
- tip
- Ubuntu Temporary failure in name resolution DNS 解析问题
- scp 拷贝目录丢失软链接的问题
- share
- 先学会做人,再来做事
algorithm ⬆
假设一个文件中有一行代码为 int output_length = 10;
,这是个 C 语言代码,我需要将其修改为 20、40、80 和 100,分别输出。
对于这一需求,用 Python 其实很简单,就是一个 find+replace 的做法,然后我试了下用 Bash Shell 脚本来处理,还花了一点时间处理(自找麻烦),那么下面对比一下代码:
1、首先是 Python 版本:
def foo(length):
with open("main.c") as f:
lines = f.readlines()
for idx, line in enumerate(lines):
if line.find("output_length") > 0:
lines[idx] = f"int output_length = {length}\n"
break
with open("main.c", "w") as f:
f.write("".join(lines))
没实际运行过,大概就是这么个流程
2、Shell 版:
[ $# -eq 1 ] && val=$1 || val=10
file=main.c
newstr="int output_length = ${val};"
# 行号
line=$(grep -n "output_length" $file | head -n 1 | cut -d":" -f1)
# 打印 & 删除对应行
sed -n "${line}p" $file
sed -i "${line}d" $file
# 插入代码
sed -i "$((line-1))a $newstr" $file > /dev/null
总结,有病。
review ⬆
由于我要使用 crontab 服务,结果发现并没有启动,我本来以为按照这个博客(解决 windows 子系统 wsl 下 crontab 无法开启的问题)就解决了。
实际上即使你把 "/etc/rsyslog.d/50-default.conf" 中 cron 的注释去掉,当 Windows 重启后,crontab 服务器还是没有自动启动,需要手动 sudo service cron start
,于是就搜了一下,发现这篇博客。
还有个类似的 CSDN 博客:(20210128 已解决)WSL2 开机启动 cron
主要步骤:
点我查看
1、将启动命令写入一个脚本
echo "service cron start" >> ~/start_cron.sh
chmod +x ~/start_cron.sh
2、启用无密码 sudo
# Open visudo to edit your sudo config
sudo visudo
# add this line to enable sudo run only this script, replace userid with your own
tian ALL=(root) NOPASSWD: /home/tian/start_cron.sh
(小插曲,由于默认编辑器是 nano,我退出后直接 vim 编辑 /etc/sudoers 导致文件损害,然后重装了 Ubuntu 20.04,果然是不作死就不会死,明明 sudoers 文件开头注释写着 "# This file MUST be edited with the 'visudo' command as root.")
3、新建定时任务
任务计划程序库 --> 创建任务
常规:start_cron
触发器:新建 --> 登录时 --> 确定
操作:新建 --> 启动程序 --> 程序或脚本(C:/Windows/System32/bash.exe)>>参加参数(-c "sudo ~/start_cron.sh"
)
(当我在写这些的时候还没尝试过,仅仅按照步骤做了,后面再更新)
更新:
上述方法无效,然后在试另一个方法:https://askubuntu.com/a/1178910/1015648
该链接给出了两个方法:
Solution 1、使用 VBE 脚本:
进入 "C:/Users/%username%/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup"
新建 sshserver.vbe 脚本,写入以下内容:
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu -u root service ssh start", vbhide
对于我则是 start_cron.vbe:
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu20.04 -u root /home/tian/start_cron.sh", vbhide
我试着运行了 wsl -d Ubuntu20.04 -u root /home/tian/start_cron.sh
发现 cron 服务确实跑起来了,而使用上述 C:/Windows/System32/bash.exe -c "sudo ~/start_cron.sh"
则没用,由此看来应该是有用的。
Solution 2、同上面的计划任务,但是使用命令不同
命令:C:/Windows/System32/wsl.exe
,参数:-d Ubuntu -u root service ssh start
再更新,经过测试,Sol. 1 确实有效!
tip ⬆
准确来说,这不是一个技巧,而是一个解决 bug 的方法,但还是记录一下,下次遇到直接解决。
上面的博客中,查了很多方法,跟我走过的路类似,差别是我最终还是通过这个博客解决的。
失败的过程就不讲了,解决方法是编辑 /etc/systemd/resolved.conf
,把 DNS 那一行解开注释,替换为 DNS=8.8.8.8
,然后重启就 OK 了。
这个我在去年就遇到过一次,今年又遇到了;
去年在遇到之后发现早就有人踩坑,且指明了方向:scp -r 拷贝目录(其中有软链)之坑------被 404 问题折腾一个晚上啊!!!,再谈软链接的 scp 拷贝,这位大哥给出的意见是不要用 scp -r
拷贝目录,先在 A 服务器上打包,然后 scp 到 B 服务器上;
话虽如此,但我遇到另一个问题,就是打包丢失文件的问题。
由于缺失头文件,而 g++ 编译输出的错误也不靠谱,说是其他头文件的定义问题,最后我才发现少东西了,绝了。
所以这里稍微做个拷贝目录的万全之策:
- A 服务器打包目录(记录总文件数 A-num)
- B 服务器解包目录,记录总文件数 B-num,比较 A-num 和 B-num
- 可选,比较两个目录所有文件的大小,看起来吓人,其实直接用 Python 脚本就搞定了,按顺序输出每个子目录(如果有)下每个文件的大小,然后 diff 就完了。
另外用 tar 打包/解包的简单命令(来自知乎:tar 命令,压缩/解压 .tar.xz 和 .tar.gz):
- 打包:
tar caf foo.tar.xz *.txt
- 解包:
tar xf foo.tar.xz
解释:
- x 是解压,c 是压缩,f 后跟压缩包的路径
- 解压时压缩包的格式会自动识别
- 压缩时 tar.gz 用 z,tar.xz 用 J(注意大小写),根据后缀自动选择用 a,否则是普通的 tar
- 显示详细信息用 v,指定解压路径用 -C(这回有横杠了)
share ⬆
昨天跟同学去集锦园吃晚饭,回实验室路上突然说起校歌、、校花和校训的问题。
我就很喜欢华科的校训:明德厚学 求是创新
我的理解校训想让每个华科学子先明明德、知是非,再厚积薄发、推陈出新。记得舅舅也说过类似的话,不求做个多成功的人,至少做一个正直善良孝顺的人。
这其实适用所有人,如果人人都能明白(显然不可能),那么那句话(树多必有枯枝,人多必有白痴)就不会流传广泛了。
网上最近涌现了很多小丑(一直都有),吃着中国的饭,花着人民币(或许不是),替外国人说话;更有甚者,管不住自己的脑子(或许只是个空壳),在网上发表侮辱先烈的言论,比如:63岁男子在微信群辱骂烈士王伟 被北京警方刑事拘留,一把年纪,活到狗身上了。
一直很好奇这些上跳下窜的都是些什么妖魔鬼怪?