【发布时间】:2015-11-29 20:26:40
【问题描述】:
我正在尝试执行一个命令 x 秒,然后停止它。我想通常你会使用timeout 命令来执行此操作,但我的机器上似乎没有该程序,所以我仍在尝试让它以不同的方式工作。
这是我尝试过的命令之一:
./some_program & sleep 5; kill `pidof some_program`
通常当我使用 ctrl+c 手动中断some_program 时,它会生成结果的 csv 文件,但上面的命令似乎只是停止它,并且没有创建 csv 文件。如果我使用kill -9,它会终止程序,但同样不会生成csv文件。
如何在 x 秒后自动停止程序并使其生成 csv 文件? (我试过kill -2、kill -3 和kill -15。)
【问题讨论】:
-
为什么不在后台运行它,捕获 pid,休眠 X 秒然后杀死它?
-
& 会把它放在后台,对吧?当上述命令执行完毕后,程序停止并没有被杀死,这是否正常(即当我执行
pgrep -lf some_program时,我仍然看到它仍然存在)? -
当你说
command &时,它会一直在后台运行,直到它完成......或者你杀了它。因此,如果您仍然使用pgrep ...(或ps -ef,或...)看到它,则意味着它仍在运行。在后台运行它的好处是它会自动“释放”您的控制台以同时运行sleep命令并随时终止脚本。 -
所以问题是如何强制你的程序在被杀死时写入
.csv文件?您可能需要增强输出程序以识别它已被中断并在退出之前写入文件。您可能可以在 shell 中使用trap并发送信号(通过 kill)来执行此操作,但更传统的是使用更高级别的语言完成,例如c或java或python等。祝你好运。 -
kill -2相当于 ctrl-c。因此,如果您说后者确实会导致 csv 转储,但前者不会,那么您应该首先调试它而不是您描述的脚本。只需手动启动some_program,然后在另一个终端中执行kill -2。这是否会导致程序转储csv?如果不是,那么some_program的信号处理中可能存在错误。