启动后台进程的 Bash 脚本会破坏终端输出并终止后台进程

启动后台进程的 Bash 脚本会破坏终端输出并终止后台进程

问题

你好!将一些代码从 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而不是&将根进程移至后台似乎可以解决这个问题,这可能是更“正确”的方法。

相关内容