在我们编写的脚本的实际场景中,仅使用开机自动运行,并不能满足我们所有脚本的需要。有些脚本显示开机后台运行后,并不能正常运行,所以这里我们使用screen工具,解决此类问题
一、screen工具介绍
(一)简介
screen
是一个功能强大的终端多路复用器,允许用户在单个终端窗口中运行多个终端会话,即使断开连接后,会话中的程序仍然可以继续运行。
(二)安装命令
sudo apt install screen
(三)使用命令
在使用 screen
命令时,确保你有足够的权限来执行这些操作,特别是在创建、杀死或清理会话时。
1. 启动和退出 Screen 会话
(1)screen
启动一个新的 screen 会话。
(2)screen -S session_name
启动一个新的名为 session_name
的 screen 会话。
(3)screen -ls
或 screen -list
列出所有正在运行的 screen 会话。
(4)screen -r session_name
重新连接到名为 session_name
的 screen 会话。
(5)screen -d session_name
detach(断开)名为 session_name
的 screen 会话。
-d
参数 表示detatch,意味着在启动screen
会话后,立即断开与该会话的连接,让会话在后台运行。
(6)-m
参数 创建一个新会话,即使当前没有连接到任何会话。这个选项通常与-d
一起使用,以便在后台启动一个新的screen
会话。
(7)Ctrl+a d
在 screen 会话中,按下 Ctrl+a
后松开,然后按 d
,可以 detach 当前会话。
2. 在 Screen 会话中导航
(1)Ctrl+a c
创建一个新的窗口(在 screen 会话中)。
(2)Ctrl+a n
切换到下一个窗口。
(3)Ctrl+a p
切换到上一个窗口。
(4)Ctrl+a 0-9
切换到编号为 0-9 的窗口。
(5)Ctrl+a w
显示所有窗口的列表。
3. 杀死 Screen 会话
screen -X -S session_name quit
杀死名为 session_name
的 screen 会话。
4. 其他有用的命令
(1)screen -wipe
清理已经死掉的会话。
(2)screen -S session_name -X stuff 'command^M'
在名为 session_name
的 screen 会话中执行 command
。^M
是 Enter 键的 ASCII 转义序列。
请注意,^M
可以通过按下 Ctrl+v
后跟 Enter
键来输入。
二、创建test01.py测试文件
(一)创建测试文件
借鉴之前文章的测试文件,连接在此,不多赘述:
ubuntu22 设置开机自动运行程序_ubuntu22开机自动运行命令-优快云博客
(二)测试执行测试文件
执行命令:
python /home/t/文档/test01.py
如果不能执行,请检查python命令是否可以直接调用python3执行,如果不可以,参考以下连接解决:
ubuntu中 输入python后python3不能调用-优快云博客
三、开机自动运行设置
(一)创建开机运行文件
在“/usr/local/bin”位置,创建start_screen_test01.sh文件
,用于启动screen
会话并执行test01.py
。
sudo vi /usr/local/bin/start_screen_test01.sh
添加如下内容:
#!/bin/bash
# 定义screen会话名称
SESSION_NAME="test01_screen"
# 检查会话是否已经存在
if screen -list | grep -q "$SESSION_NAME"; then
echo "Screen session already exists."
else
# 创建新的screen会话并运行test01.py
screen -dmS $SESSION_NAME python /path/to/test01.py
fi
替换/path/to/test01.py
为test01.py
的实际路径。
(二)给脚本执行权限
sudo chmod +x /usr/local/bin/start_screen_test01.sh
(三)测试启动文件
注意:在使用root权限下,无法运行该程序
1. 执行程序
./usr/local/bin/start_screen_test01.sh
2.检查
(1)查看已经开启的screen服务
screen -ls
显示如下内容时,表示该screen成功调用python文件,建立新的screen任务完成。
显示下面内容时,表示建立任务失败
(2)关闭该服务
为了后面测试重新执行该任务,这里需要先关闭已经成功建立的screen任务
screen -X -S test01_screen quit
(四)创建一个systemd服务文件
sudo vi /etc/systemd/system/screen_test01.service
该文件添加以下内容:
[Unit]
Description=Screen Session for test01.py
After=network.target
[Service]
ExecStart=/usr/local/bin/start_screen_test01.sh
User=your_username
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
替换your_username
为你的用户名。
Restart这个选项,可以填写的参数及意义如下:
(1)默认值,服务退出后不会重启。
(2)on-success
: 只有当服务正常退出(退出码为0),或者服务状态发生变化时才会重启。
(3)on-failure
: 只有当服务异常退出(退出码非0),或者服务状态发生变化时才会重启。
(4)on-abnormal
: 只有当服务因信号而异常终止,或者服务状态发生变化时才会重启。
(5)on-abort
: 只有当服务因收到没有捕捉到的信号而终止,或者服务状态发生变化时才会重启。
(6)on-watchdog
: 只有当服务通过看门狗超时而终止时,才会重启。
(7)always
: 无论服务因为什么原因退出,总是重启服务。
(8)unless-stopped
: 服务在启动时不会重启,但是如果服务在运行时被停止,它不会重启。
(五)启用并启动服务
sudo systemctl start screen_test01.service
sudo systemctl enable screen_test01.service
(六)检查服务状态
sudo systemctl status screen_test01.service