运行在后台等待输入的进程,不会暂停和不发送输入

时间:2012-03-05 23:05:49

标签: linux bash redirect background-process

我有一个程序执行类似的操作,以便等待有人按Enter键以退出:

spawnThreadAndDoStuff();
System.in.read();
System.exit(0);

我想在脚本中无限期地在后台运行它,当我希望它结束​​时就去杀它。我认为从/ dev / null读取输入会这样做,但它似乎不起作用。我的脚本看起来像:

#!/bin/bash
java -cp someapp > mylog.log < /dev/null &

我这样做是错的,还是我的做法还没办法?处理这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

/dev/null读取不起作用,因为read会立即返回文件结尾。

这对我有用:

(while true; do sleep 10000; done) | java -cp someapp > mylog.log &

第一个命令只是永远地睡觉,从不提供任何输入。

答案 1 :(得分:1)

你做错了是/ dev / null的输入就像一个0字节的文件,所以进程在标准输入上命中EOF并退出。如果/ dev / null可以保存一个期望输入的进程,那么这将起作用:

$ cat < /dev/null

但当然猫会马上退出。

你被一个带有从TTY读取的线程的程序的问题所困扰。一旦你背景它,因为它是从TTY读取,tty驱动程序发送一个SIGTTIN,它停止所有的线程。

我只想重新考虑该计划。如果您希望程序在后台运行良好,请不要将用户输入作为终止信号读取。当你希望它停止时,摆脱那个读取并用信号杀死它。

如果您想要两种行为(后台模式和用户退出模式),那么可以使程序运行时可配置。一种方法是简单地检测标准输入是否是TTY设备。如果是TTY设备,则执行TTY读取并退出。如果它不是TTY,那么请不要阅读:做一个无限的睡眠。然后你的/ dev / null标准输入技巧应该工作。 / dev / null不是TTY,因此进程只会睡眠。

(你在Java中有isatty函数吗?)

答案 2 :(得分:0)

命令......&amp; thePIDofCOMMAND = $!

....做的事情 杀死thePIDofCOMMAND