shell 为使用nohup启动的进程给予自定义名称

llycmphe  于 2023-03-03  发布在  Shell
关注(0)|答案(2)|浏览(280)

当我使用exec创建新进程时,我可以使用-a选项为其指定一些自定义名称,即exec -a MyName MyCommand
这样做便于处理一堆用不同参数启动的相同进程。例如,如果我有以下:

exec -a MyName1 MyCommand param1
exec -a MyName2 MyCommand param2

出于某种原因我想杀死后者,就像这样简单:pkill -f MyName2.
问题是我不知道如何在使用nohup启动的进程中实现同样的效果。我读过关于-p选项的文章,但它并不总是受支持。disjoin似乎也不起作用。
有人遇到过类似的问题吗?

ruyhziif

ruyhziif1#

Bash的exec命令有一个-a NAME选项:

nohup bash -c 'exec -a xxx sleep 12345'

根据help exec

exec: exec [-cl] [-a name] [command [argument ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.

    Options:
      -a name   pass NAME as the zeroth argument to COMMAND
      -c        execute COMMAND with an empty environment
      -l        place a dash in the zeroth argument to COMMAND

    If the command cannot be executed, a non-interactive shell exits, unless
    the shell option `execfail' is set.

    Exit Status:
    Returns success unless COMMAND is not found or a redirection error occurs.
pxq42qpu

pxq42qpu2#

首先,您不需要nohup;它可以做shell自己做不到的事情。

exec -a MyName1 MyCommand param1 >nohup.out 2>&1 </dev/null & disown -h "$!"
exec -a MyName2 MyCommand param2 >nohup.out 2>&1 </dev/null & disown -h "$!"

nohup所做的大部分工作只是重定向,其余部分与disown -h相同(它告诉shell不要将HUP信号转发给那个进程)。
当然,您也可以选择一个不同的文件来存储每个命令的日志,并将PID存储在变量中--执行后一种操作将完全避免使用pgrep

相关问题