【问题标题】:Stopping a command after x seconds without using timeout [duplicate]x秒后停止命令而不使用超时[重复]
【发布时间】: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 -2kill -3kill -15。)

【问题讨论】:

  • 为什么不在后台运行它,捕获 pid,休眠 X 秒然后杀死它?
  • & 会把它放在后台,对吧?当上述命令执行完毕后,程序停止并没有被杀死,这是否正常(即当我执行pgrep -lf some_program时,我仍然看到它仍然存在)?
  • 当你说command & 时,它会一直在后台运行,直到它完成......或者你杀了它。因此,如果您仍然使用pgrep ...(或ps -ef,或...)看到它,则意味着它仍在运行。在后台运行它的好处是它会自动“释放”您的控制台以同时运行 sleep 命令并随时终止脚本。
  • 所以问题是如何强制你的程序在被杀死时写入.csv 文件?您可能需要增强输出程序以识别它已被中断并在退出之前写入文件。您可能可以在 shell 中使用 trap 并发送信号(通过 kill)来执行此操作,但更传统的是使用更高级别的语言完成,例如 cjavapython 等。祝你好运。
  • kill -2 相当于 ctrl-c。因此,如果您说后者确实会导致 csv 转储,但前者不会,那么您应该首先调试它而不是您描述的脚本。只需手动启动some_program,然后在另一个终端中执行kill -2。这是否会导致程序转储csv?如果不是,那么some_program 的信号处理中可能存在错误。

标签: linux bash kill


【解决方案1】:

要获得与 C-c 相同的效果(假设程序不会更改 tty 设置以以非标准方式处理它),您需要发送SIGINT。另外,避免运行 pidof - 当您使用 kill 时,bash 会为您提供最后一个后台作业为 %+

你应该可以

./some_program & sleep 5; kill -INT %+

示范

$ time bash -c 'sleep 15 & sleep 3; kill -INT %+'

real    0m3.005s
user    0m0.001s
sys     0m0.004s

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多