我有一个程序执行类似的操作,以便等待有人按Enter键以退出:
spawnThreadAndDoStuff();
System.in.read();
System.exit(0);
我想在脚本中无限期地在后台运行它,当我希望它结束时就去杀它。我认为从/ dev / null读取输入会这样做,但它似乎不起作用。我的脚本看起来像:
#!/bin/bash
java -cp someapp > mylog.log < /dev/null &
我这样做是错的,还是我的做法还没办法?处理这个问题的正确方法是什么?
答案 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