使用&(bg)运行时,Linux csh脚本将转为Suspended(tty输出)

use*_*898 2 java linux shell

我有奇怪的行为我有运行java进程的csh文件,如下所示:

run_server.csh

#!/usr/bin/tcsh

java -Dtest=testparam -cp ${TEST}/lib/device.jar:${TEST}/conf:${TEST}/lib/commons-logging-1.1.1.jar  com.device.server
Run Code Online (Sandbox Code Playgroud)

当我像这样运行它:run_server.csh&在linux中的putty shell中我得到这个按摩:

[2]  + Suspended (tty output)        run_server.csh
Run Code Online (Sandbox Code Playgroud)

虽然当我运行它没有&符号服务器正在运行并将其日志按摩输出到stdout但问题是当我按ctr + c时,进程被杀死

另一个奇怪的事情是,如果我将包装脚本写入run_server.csh,看起来像这样run_server_wrapper.csh:

#!/usr/bin/tcsh 
run_server.csh &
sleep 5
Run Code Online (Sandbox Code Playgroud)

它确实运行服务器作为bg进程和run_server_wrapper.csh它自己得到按摩:

[2]  + Suspended (tty output)        run_server_wrapper.csh
Run Code Online (Sandbox Code Playgroud)

这里有什么问题 ?

Thi*_*ame 5

发生的事情是你把这个过程放在后台,但它还在写给终端.终端驱动程序不批准这种行为,并在尝试写入TTY时暂停该进程.当然,显而易见的答案是停止这样做.如果您要run_server.csh进入后台,还应该重定向输出,如下所示:

run_server.csh > /path/to/serverlog 2>&1 &
Run Code Online (Sandbox Code Playgroud)

如果您希望程序在后台运行并且您仍希望查看输出,通常的解决方案是将输出重定向到我显示的日志文件,然后使用该tail命令监视日志文件.

tail -f /path/to/serverlog
Run Code Online (Sandbox Code Playgroud)

如果你真的,真的想在后台运行一些东西并且仍能写入TTY,请关闭tostop标志.

stty -tostop
Run Code Online (Sandbox Code Playgroud)