问题
你好!将一些代码从 Ubuntu 20 移到 Ubuntu 22 后,我发现我启动的一些 bash 脚本存在一些奇怪的行为。第一个值得注意的问题是,运行脚本后,终端开始按照阶梯状模式打印文本,如下所示:
line1
line2
line3
...
lin
eN
此外,您尝试在终端中输入的任何文本都不会显示在屏幕上(但命令仍然有效)。这主要会造成一点不便,因为它只是视觉上的,因为命令仍然正常工作。主要问题是,当您从同一脚本在后台运行进程时,在脚本完成并且进程仍然启动后,与终端的任何键交互都会立即终止后台进程。
此错误仅发生在 Ubuntu 22 中
预期行为
如果您的操作系统是 Ubuntu 20,此代码的预期行为就会发生。脚本按预期运行并连续打印数字。为了终止进程,您需要使用诸如“kill”或“killall”之类的命令。终端仍可自由用于将来的命令。
最小示例
经过多次调试后,我设法编写了一个展示错误的最小示例,所需的文件如下:
文件:test.cpp(编译为 g++ test.cpp -o test)
// Minimal example in C++
#include <iostream>
#include <chrono>
#include <thread>
int main() {
uint64_t i = 0;
while (true) {
std::cout << i++ << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
文件:test.py
# Minimal example in Python
import time
if __name__ == '__main__':
i = 0
while True :
print(i)
i+=1
time.sleep(1)
文件:scriptC++.sh
#!/usr/bin/bash
sudo ./test &
sleep 3
文件:scriptPy.sh
#!/usr/bin/bash
sudo python3 test.py &
sleep 3
文件中的冗余主要是为了表明错误不是由于 C++ 或 Python 引起的,而是与 Ubuntu 22 或新版本的 bash 或其他库有关(bash 和低级库不是我的专长)。
额外的信息
我设法收集了一些与该问题相关的额外信息:
- 如果后台进程在 bash 脚本之前完成,则一切正常。仅当后台进程比 bash 脚本存活时间长时才会发生此错误。
- 后台进程需要以“sudo”权限启动。否则不会发生错误。
问题
我的主要问题是,这是否是 bash、Ubuntu22 或某个相关库中的错误,以及其他人是否也遇到了这个问题。我在两台 Ubuntu22 计算机上启动了这个最小示例,得到了相同的结果,但我在两台计算机上都安装了相同的库,因此我不能排除它可能是第三方库。最后,如果这是一个错误,我应该如何报告?我见过命令“ubuntu-bug”,但它要求我指定一个进程,我不确定在这种情况下是哪一个。
答案1
我也遇到过这种情况。使用sudo -b
而不是&
将根进程移至后台似乎可以解决这个问题,这可能是更“正确”的方法。