我不知道这是否属于 SO(因为它是一个编码错误)但我认为你们会对所用软件的细微差别有更多的了解(所以甚至可以考虑 U&L)。
这是最小的代码脚本(请参阅编辑以获取完整脚本,我这样做是有原因的);
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
它试图在后台运行一个服务器,该服务器输出到日志文件。
然后我follow
使用该日志文件less +F
。正如你所做的那样,要退出它,你必须先按ctrl+ c,然后才能按Q。
发生的事情是,当我在命令(停止)中ctrl按 +时,它会以某种方式终止从顶部启动的服务器!其他任何事情都不会受到影响。我可以按 +再次开始跟踪日志(由于服务器被终止,因此不会获得任何新信息),如果我按 + ,脚本的其余部分将正常执行。cless
tailing
nohup
shiftfQ
您知道为什么会发生这种情况吗?如何避免这种情况/我应该使用其他方法吗?
PS
服务器程序可能正在监听^C
,这可能是问题所在;我能做些什么来阻止它吗?例如,当我自己运行它{SERVERCOMMAND}
(以阻塞方式)时,我可以按ctrl+ c,这不会立即杀死它;它会打印Received ^C signal, shutting down
(然后自杀)。这就是我^C
进入时发生的事情less
(将 finalReceived ^C signal, shutting down
写入日志)。
PPS
我已经尝试了很多方法(但都没有奏效);
尝试通过更改来断开 stdin 与脚本的连接
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & to nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 & or nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
用来
stty intr ^G
替换中断命令,但随后ctrl+g所做的正是^C
所做的事情(因此这可能是我的终端仿真器的问题;konsole
)将
nohup
&/或less
行放在括号中(使其成为子 shell)运行脚本
xterm
而不是konsole
答案1
当+时,我正确地想到它会SIGINT
被发送到所有进程,但是我愚蠢地认为创建另一个进程会将它带出(请参阅中的我的尝试)。ctrlcprocess group
P.P.S.
这不仅是确切的用例,而且是正确的解决方案。
由于我的脚本的结构,那里的答案并不逐字逐句地适合,这是现在的脚本;
#/bin/bash
setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
ctrlI + cin之后服务器继续输出到日志文件less
。
感谢大家的时间。
答案2
你有没有尝试过否认?
disown -h %1
无论你的工作是什么;否认是一个内置的 shell,它的手册页状态:
否认
放弃 [-ar] [-h] [jobspec ...]
如果没有选项,则每个 jobspec 都会从活动作业表中删除。如果
-h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the
-a' 或-r' option is supplied, the current job is used. If no jobspec is supplied, the
-a' 选项表示删除或标记所有作业;没有 jobspec 参数的 `-r' 选项会将操作限制为正在运行的作业。
编辑
有趣的是,你的构造可以在我的 Arch Linux 上运行:
$ cat testm
#!/bin/sh
nohup /home/mario/temp/waste &
less +F out.log
$ cat waste
#!/bin/sh
while [ 1 ]; do
find / -print 2>1 1> out.log
done
$ ./testm
nohup: appending output to ‘nohup.out’
$ ps ax | grep waste
19090 pts/2 S 0:00 /bin/sh /home/mario/temp/waste
19124 pts/2 S+ 0:00 grep waste]
$
之前附言命令,我必须滚动 out.log 文件,然后Ctrl+C,然后q。