0%

命令 标准输出 错误输出
>/dev/null 2>&1 丢弃 丢弃
2>&1 >/dev/null 丢弃 屏幕

比如要添加一个环境变量

1
NAME=NAONAO

临时添加

1
export NAME=NAONAO

永久添加

Method 1

1
nano /etc/profile

在文件底部添加

1
export NAME=NAONAO

Method 2

1
nano ~/.bashrc

在文件底部添加

1
export NAME=NAONAO

问题描述

1
kernel connecting

及无法连接到后端的 Python, Shell 也无法打开

架构

笔者采用 jupyter docker + nginx 反向代理这个模式

打开日志发现

1
[W 2022-02-22 15:14:10.078 ServerApp] 400 GET /terminals/websocket/1 (172.18.0.1) 0.67ms referer=None

解决方法

更改 nginx 反向代理配置, 可能是没有识别websocket请求所致, 具体原因尚不清楚, 但以下这个配置在笔者这里可用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
location ~* \.(gif|png|jpg|css|js|woff|woff2)$
{
proxy_pass https://127.0.0.1:10000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
expires 12h;
}
location /
{
proxy_pass https://127.0.0.1:10000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";

add_header X-Cache $upstream_cache_status;

#Set Nginx Cache

add_header Cache-Control no-cache;
}

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
name="Shell"
url="http://c.biancheng.net/shell/"
str1=$name$url #中间不能有空格
str2="$name $url" #如果被双引号包围,那么中间可以有空格
str3=$name": "$url #中间可以出现别的字符串
str4="$name: $url" #这样写也可以
str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5

结果

1
2
3
4
5
6
Shellhttp://c.biancheng.net/shell/
Shell http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
ShellScript: http://c.biancheng.net/shell/index.html

参考链接

http://c.biancheng.net/view/1114.html

截取

从指定位置开始截取

从字符串左边开始截取

格式

1
${string:start:end}

1
2
3
url="c.biancheng.net"
echo ${url: 2: 9}
biancheng

end 省略则截取到末尾

1
2
3
url="c.biancheng.net"
echo ${url: 2} #省略 length,截取到字符串末尾
biancheng.net

从右边开始截取

格式

1
${string: 0-start :length}

1
2
3
url="c.biancheng.net"
echo ${url: 0-13: 9}
biancheng

end 省略

1
2
3
url="c.biancheng.net"
echo ${url: 0-13} #省略 length,直接截取到字符串末尾
biancheng.net

从指定字符(串)开始截取

使用 # 号截取右边字符

1
${string#*chars}

1
2
3
url="http://c.biancheng.net/index.html"
echo ${url#*:}
//c.biancheng.net/index.html

注意,以上写法遇到第一个匹配的字符(子字符串)就结束了。例如

1
2
3
url="http://c.biancheng.net/index.html"
echo ${url#*/}
/c.biancheng.net/index.html

如果希望直到最后一个指定字符(子字符串)再匹配结束,那么可以使用##,具体格式为

1
${string##*chars}

1
2
3
4
5
6
7
#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url#*/} #结果为 /c.biancheng.net/index.html
echo ${url##*/} #结果为 index.html
str="---aa+++aa@@@"
echo ${str#*aa} #结果为 +++aa@@@
echo ${str##*aa} #结果为 @@@

使用 % 截取左边字符

使用%号可以截取指定字符(或者子字符串)左边的所有字符,具体格式如下:

1
${string%chars*}

请注意的位置,因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以应该位于 chars 的右侧。其他方面%和#的用法相同,这里不再赘述,仅举例说明:

1
2
3
4
5
6
7
#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url%/*} #结果为 http://c.biancheng.net
echo ${url%%/*} #结果为 http:
str="---aa+++aa@@@"
echo ${str%aa*} #结果为 ---aa+++
echo ${str%%aa*} #结果为 ---

总结

格式 说明
${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符
${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后
${string#*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符
${string##*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符
${string%*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符
${string%%*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符

参考链接

http://c.biancheng.net/view/1120.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html
TypeError [ERR_INVALID_ARG_TYPE]: The "mode" argument must be integer. Received an instance of Object
at copyFile (fs.js:1890:10)
at tryCatcher (C:\Users\Administrator\blog\node_modules\bluebird\js\release\util.js:16:23)
at ret (eval at makeNodePromisifiedEval (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promisify.js:184:12), <anonymous>:13:39)
at C:\Users\Administrator\blog\node_modules\hexo-deployer-git\node_modules\hexo-fs\lib\fs.js:144:39
at tryCatcher (C:\Users\Administrator\blog\node_modules\bluebird\js\release\util.js:16:23)
at Promise._settlePromiseFromHandler (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:517:31)
at Promise._settlePromise (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:574:18)
at Promise._settlePromise0 (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:619:10)
at Promise._settlePromises (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:699:18)
at Promise._fulfill (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:643:18)
at Promise._resolveCallback (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:437:57)
at Promise._settlePromiseFromHandler (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:529:17)
at Promise._settlePromise (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:574:18)
at Promise._settlePromise0 (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:619:10)
at Promise._settlePromises (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:699:18)
at Promise._fulfill (C:\Users\Administrator\blog\node_modules\bluebird\js\release\promise.js:643:18)

解决办法是修改package.json文件,升级hexo-renderer-stylus2.0.0版本

参考链接

https://evestorm.github.io/posts/430/

https://www.4spaces.org/hexo-mode-argument-must-be-integer-error/

错误描述

1
2
3
4
5
6
7
8
9
10
11
12

文件系统特定的 LookupAndOpen[file] 实施失败
文件系统特定的 LookupAndOpen[file] 实施失败
文件系统特定的 LookupAndOpen[file] 实施失败
文件系统特定的 LookupAndOpen[file] 实施失败
文件系统特定的 LookupAndOpen[file] 实施失败
文件系统特定的 LookupAndOpen[file] 实施失败
对象类型需要托管的 I/O
无法打开磁盘“/vmfs/volumes/5ec70d97-8b7959b3-d45b-ecf4bbe3557c/openwrt/openwrt-x86-64-generic-squashfs-combined.vmdk”或其所依赖的快照磁盘之一。
模块“Disk”打开电源失败。
无法启动虚拟机。

解决方案, 找到对应的磁盘文件(可以在网页里查看到磁盘的挂载路径)

例如

1
[datastore1] openwrt/openwrt-x86-64-generic-squashfs-combined.vmdk 

尝试修复

1
vmkfstools -x repair /vmfs/volumes/<datastorepath>/<vm name>/<vm name main base disk>.vmdk

例如

1
2
3
4
# 切换到该目录下
cd /vmfs/volumes/datastore1/openwrt
# 修复
vmkfstools -x repair openwrt-x86-64-generic-squashfs-combined.vmdk

结果

1
Disk was successfully repaired.

磁盘修复成功, 可以打开了.

参考链接

https://kb.vmware.com/s/article/2149438?lang=zh_CN

SSL Error

当 jupyter 配置了 SSL 时, Nginx 反向代理时也需要用 https 协议

例如, 反向代理到本地的 10000 端口

错误示范

1
proxy_pass http://127.0.0.1:10000;

正确示范

1
proxy_pass https://127.0.0.1:10000;

Websocket 连接问题

在基于 Docker 部署 jupyter 工作环境时, 可能会发生可以打开网页, 可以创建文件, 但是无法与后端 python 连接的情况.

查看 jupyter 日志显示

1
2
3
4
5
6
7
jupyter    | [W 2021-09-21 16:09:24.778 ServerApp] 400 GET /terminals/websocket/1 (172.27.0.1) 1.21ms referer=None
jupyter | [W 2021-09-21 16:09:26.418 ServerApp] 400 GET /terminals/websocket/1 (172.27.0.1) 1.13ms referer=None
jupyter | [W 2021-09-21 16:09:28.696 ServerApp] 400 GET /terminals/websocket/1 (172.27.0.1) 1.28ms referer=None
jupyter | [W 2021-09-21 16:09:30.660 ServerApp] 400 GET /terminals/websocket/1 (172.27.0.1) 1.24ms referer=None
jupyter | [W 2021-09-21 16:09:37.605 ServerApp] 400 GET /terminals/websocket/1 (172.27.0.1) 1.15ms referer=None
jupyter | [W 2021-09-21 16:09:41.758 ServerApp] 400 GET /terminals/websocket/1 (172.27.0.1) 1.11ms referer=None

当我尝试用 jupyter 提供的 terminal 时, 发现以上日志.

这说明这个请求没有成功, 400 状态码参考 MDN

1
HTTP 400 Bad Request 响应状态码表示由于语法无效,服务器无法理解该请求。 客户端不应该在未经修改的情况下重复此请求。

所以应该是 nginx 在与 jupyter 通信时发生了问题.

Google …

找到以下解决方案, 一个可用的 Nginx 反向代理配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

location / {
proxy_pass http://jupyter;

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ~* /(api/kernels/[^/]+/(channels|iopub|shell|stdin)|terminals/websocket)/? {
proxy_pass http://jupyter;

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

}

注意添加这三项

1
2
3
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

参考链接

https://github.com/jupyter/notebook/issues/625

https://jupyter-notebook.readthedocs.io/en/latest/config.html#options

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/400

https://gist.github.com/cboettig/8643341bd3c93b62b5c2

问题描述

在用 crontab 定时备份 gitlab 时, 发现任务总是不成功. 😱😱😱

命令如下

1
0 0 * * * /root/docker/gitlab/backup-gitlab.sh >> /root/docker/gitlab/backup-gitlab.log 2>&1

测试后发现日志总是没有任何输出, 说明这个命令没有被执行. 🤔🤔🤔

随便写了条命令测试

1
* * * * * echo "`date`" > /root/crontest.log

发现有输出…. 😲😲😲

那么说明 crontab 确实工作了…. 😵😵😵

沉思…. 🤔🤔🤔

解决方案

虽然我不太清楚是什么原因, 但是当我把以下配置加入 crontab 后他开始工作了. 😄😄😄

1
2
3
4
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

也许是因为显式指定了 shell, 以及一些其他的一些参数, 导致可以正常工作, 因为我之前一直怀疑是权限的问题. 🤣🤣🤣

参考连接

https://my.oschina.net/leejun2005/blog/1788342