linux 为啥不能后台运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 为啥不能后台运行相关的知识,希望对你有一定的参考价值。

前置知识:
xterm,console,tty,pts,pty的区别
shell是直接和内核进行通信的东西
xterm是一个软件概念,可以通过这个程序连接到console从而控制主机,可以理解为cli形式的终端模拟器,而gnome-terminal,konsole就是gui形式的终端模拟器
console是主机的控制台,是一个物理概念。
tty、pty、pts都是终端,是硬件或者设备概念。
tty是所有终端设备的总称
pty是其中一类,伪终端,或者叫虚拟终端
“&” 命令行结尾法:
在Unix/Linux下如果想让程序独立终端运行,一般都是使用 & 在命令结尾来让程序自动运行。(命令后可以不追加空格)
打开gnome-terminal,执行如下命令:
delectate@delectate:~$ totem &
[1] 8510
delectate@delectate:~$
有几点需要注意:
已经启动的程序依然attach于当前pts,只有当前终端模拟器关闭(使用exit命令退出),进程自动被tty继承。
delectate@delectate:~$ ps -e | grep totem
//程序已被以totem & 形式启动,当前附在pts0上
8819 pts/0 00:00:00 totem
delectate@delectate:~$ ps -e | grep totem
//pts0的模拟终端被exit命令关闭,totem自动附在tty
8819 ? 00:00:00 totem
delectate@delectate:~$
具有debug输出的进程,需要按enter键进行中断当前debug输出。但是如果程序持续进行printf,你将无法输入任何命令。
delectate@delectate:~$ vlc &
[1] 8850
delectate@delectate:~$ VLC media player 1.0.6 Goldeneye
[0x8b998b0] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
//enter pressed
delectate@delectate:~$ //show a clean terminal now
** (:8850): CRITICAL **: giop_thread_request_push: assertion `tdata != NULL' failed
//仍然在输出数据……
//关闭程序
[1]+ Done vlc
delectate@delectate:~$
你无法记录程序的debug输出结果。
只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按enter——如果程序持续输出信息而没有出现 $ 或 #)
使用nohup命令:
nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中断/挂起信号,使命令继续执行)
但是当你尝试使用命令:
1

nohup command
时候却会遇到不大不小的麻烦……
delectate@delectate:~$ nohup vlc
nohup: ignoring input and appending output to `nohup.out'
是的,虽然它自动把debug信息记录到nohup.out文件,但是你却无法使用这个终端进行任何操作。
所以你需要和第一个方法混用,即
nohup command option &
混用后,它会自动把你执行的命令输出结果记录到权限为-rw——-,名为nohup.out的文件中。
但是你仍然需要
delectate@delectate:~$ nohup vlc &
[1] 9045
delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out'
参考技术A 在控制台运行环境的时候再命令后边加上&这个标志就可以了,Linux就可以在后台运行该任务。
在后台运行任务,表示在前台的Console中可以执行其他任务。本回答被提问者采纳

为啥 Web Serial API 应用程序可以在 Windows 和 Linux 中运行,但不能在 macOS 中运行?

【中文标题】为啥 Web Serial API 应用程序可以在 Windows 和 Linux 中运行,但不能在 macOS 中运行?【英文标题】:Why might a Web Serial API app work in Windows and Linux but not macOS?为什么 Web Serial API 应用程序可以在 Windows 和 Linux 中运行,但不能在 macOS 中运行? 【发布时间】:2021-02-13 11:27:54 【问题描述】:

我正在尝试开发一个网页,该网页可以与连接到计算机 USB 端口的 STM Nucleo 板通信。 Nucleo 板通过 USB 使用串行端口连接进行通信,我可以使用串行终端程序(在我的例子中为 CoolTerm)愉快地与它交谈。浏览器应用程序在 Windows 和 Linux 中运行良好,但在 macOS 中则不行。 macOS 报告串行连接可用,似乎连接并正确打开端口,并开始工作,但在发送几十个字节后,mac 中的串行端口似乎冻结,并且不再向 Nucleo 传输任何内容木板。 Web 串行应用程序在发送器停止发送数据之前和之后报告所有标志(CTS、DCD、DSR 和 RI)为假,但打开端口时 flowControl 设置为默认值“none”)。

有谁知道为什么会发生这种情况以及如何让 mac 串行端口传输超过几十个字节?

(我在尝试使用 python 和 pyserial 时观察到完全相同的行为:它适用于 Windows 和 Linux,但不适用于 macOS,所以我假设这与 macOS 串行端口有关。)

打开端口并发送数据的代码如下所示:

async function _serialNewClickConnect() 

    // Select the serial port.  Note: can add filters here, see web.dev/serial
    _serialPort = await navigator.serial.requestPort();

    // Open the serial port.
    await _serialPort.open( baudRate: 115200, bufferSize: 64 );

    // Set up to allow data to be written:
    _serialWriter = _serialPort.writable.getWriter();

    // Listen to data coming from the serial device.
    while (_serialPort.readable) 

        _serialReader = _serialPort.readable.getReader();
        try 
            while (true) 
                const  value, done  = await _serialReader.read();
                if (done) 
                    // To allow the serial port to be closed later:
                    _serialReader.releaseLock();
                    break;
                
                if (value) 
                    // Something has arrived.  This will be stored in value as a uint8 array.
                    for (let x = 0; x < value.byteLength; x++) 
                        _serialRxData.push(value[x]);
                    
                
            
         catch (error) 
            // TODO: Handle non-fatal read error.
        
    


async function sendString(string) 
    // Sends a string over the serial port.
    const data = new TextEncoder().encode(string);
    await _serialWriter.write(data);

【问题讨论】:

【参考方案1】:

非常感谢一位同事(他的工作没有 Stack Overflow 帐户来获得奖励),我找到了一个(部分)答案:“因为 Nucleo 板的固件中存在错误” .

将 Nucleo 板上的固件更新到最新版本解决了该问题。为什么旧固件可以在 macOS 上与 Windows、Linux 和 Coolterm 一起使用,但不能在 macOS 上与 python 脚本或 Web Serial API 一起使用,我可能永远也不会知道。但我很想知道整个故事。如果有人了解更多信息,请发表回复/评论。

【讨论】:

以上是关于linux 为啥不能后台运行的主要内容,如果未能解决你的问题,请参考以下文章

linux脚本后台运行失败

linux 命令后台执行 不能返回shell

Linux下如何让某指令在后台一直运行

linux终端在下载东西,不能干其他事,能不能把终端调到后台运行,用啥命令(不打开另一个终端)?Ubuntu

为啥有人说Apple 不允许iphone运行后台任务?

linux 后台运行nohup & ctrl+z