linux 挂起没有pid shell命令

deyfvvtc  于 2023-04-20  发布在  Linux
关注(0)|答案(6)|浏览(214)

我需要像$command & stop这样的东西这应该执行命令并挂起它。应用程序稍后恢复命令以获得完整的结果。
我理解可以通过向相应的pid发送停止信号来暂停作业。

$kill -SIGSTOP 12753

当我们执行一个命令时,我们几乎不知道它的pid。需要额外的命令来获取pid并执行所需的操作。我想避免额外的命令和时间间隔。
基本上,该应用程序用于测量网络性能。触发所有命令,使其处于暂停模式。暂停的命令将根据所需的流量类型恢复。

oogrdqng

oogrdqng1#

最近启动的后台命令的进程ID在shell参数$!中可用:

$ command & kill -SIGSTOP $!

(请查看您的shell实现kill的文档,以获得正确的格式。)

yebdmbv4

yebdmbv42#

使用**--signal**选项尝试killall,您可以在其中指定进程的名称。

linux:~ # killall
Usage: killall [OPTION]... [--] NAME...
       killall -l, --list
       killall -V, --version

  -e,--exact          require exact match for very long names
  -I,--ignore-case    case insensitive process name match
  -g,--process-group  kill process group instead of process
  -i,--interactive    ask for confirmation before killing
  -l,--list           list all known signal names
  -q,--quiet          don't print complaints
  -r,--regexp         interpret NAME as an extended regular expression
  -s,--signal SIGNAL  send this signal instead of SIGTERM
  -u,--user USER      kill only process(es) running as USER
  -v,--verbose        report if the signal was successfully sent
  -V,--version        display version information
  -w,--wait           wait for processes to die

通过在shell会话中启动md5sum进行验证:

linux$ md5sum

在另一个会话中,运行:

killall -s SIGSTOP md5sum

md5sum会话中产生以下结果:

[1]+  Stopped                 md5sum
pvcm50d1

pvcm50d13#

请确认是否要停止命令或在后台运行(在命令后添加'&')?
如果您的应用程序预计将启动暂停命令后,那么为什么不启动您的命令(被暂停)在该应用程序本身。
这有助于:
sleep 5 & kill -SIGSTOP $!
在上面,已经在后台执行了sleep(demo命令)5秒。接下来发送kill以使用$!获得的PID停止它。

fkaflof6

fkaflof64#

Demo & kludge使用timeout(由于某种原因,timeout将'0 s'持续时间解释为“永远运行”),在输出任何内容之前停止yes

# run 'yes' command, let it print 5 numbered lines, but stop it immediately
timeout -s SIGSTOP .000000001s yes | head -n 5 | cat -n

输出(至STDERR):

[1]+  Stopped     timeout -s SIGSTOP .000000001s yes | head -n 5 | cat -n

重新启动它:

fg > /dev/null

输出:
为使用v8.12或更早版本coreutils(2011年之前)的用户提供的技术,其中timeout缺少 * 次秒间隔 *。需要等待一秒。
将命令字符串 Package 在shell调用中,前面有一个1 s的等待-所以timeout等待1秒,同时,命令字符串也等待1秒。总等待时间1秒:

timeout -s SIGSTOP 1s sh -c "sleep 1s; yes | head -n 5 | cat -n"

输出和以前一样,fg也一样。
如果在睡眠前等待1秒太多,它可以在后台运行,如下所示:

timeout -s SIGSTOP 1s sh -c "sleep 1s; yes | head -n 5 | cat -n" &

输出(过程编号将有所不同):

[1] 14601

一秒钟后,输出将与前面两个timeout示例相同。

btxsgosb

btxsgosb5#

假设你正在使用相同的命令,在ps输出中找到命令名,你可以在一个终端中启动它然后打开一个新的终端

ps -ely

检索命令名称后:

command & kill -SIGSTOP $(pidof command_name)

pidof需要确切的命令名才能找到pid。
然后恢复它:

kill -SIGCONT $(pidof command_name)

如果命令名不是常量,但有一个模式,您可以创建一个类似这样的脚本,您可以将其命名为pof.sh:

ps -ely | grep $1 | tr -s ' ' | cut -d" " -f3

command &  kill -SIGSTOP $(bash pof.sh pattern)

这个脚本的一个缺点是,如果很多行都匹配模式,它将返回所有的pid,如果这是一个问题,你可以把输出放在一个数组中,然后从那里继续。

5anewei6

5anewei66#

简单地回答标题。
暂停正在运行的命令,例如FFmpeg:

kill -17 `ps aux | grep -E "\s[f]fmpeg\s" | awk '{print $2}'`

或者,更简单:

kill -17 `pidof ffmpeg`

使用-17-18-读取here以了解差异。
我更喜欢使用pgrep,因为它似乎比pidof更可靠:

kill -17 `pgrep ffmpeg`

或者,创建您自己的“命令”:

pid () { ps aux | grep -E "\s$(echo $1 | sed -r 's/(\S)(\S*)/\[\1\]\2/')\s" | awk '{print $2}' }

因此,暂停/恢复变得更简单:

$ kill -17 `pid ffmpeg`
$ kill -19 `pid ffmpeg`

还有pkill命令:

pkill -17 -f ffmpeg

但是,它不如将killpgreppid组合使用可靠。
它不太可靠的原因是:pkill命令将以包含 ffmpeg word的任何进程为目标,而不仅仅是ffmpeg进程。

相关问题