如何在 Linux 中用一个命令终止并重新运行进程

如何在 Linux 中用一个命令终止并重新运行进程

通常,我ps在 Linux 上使用该命令来查找进程的 pid,然后使用该 pid 终止该进程,然后使用该特定进程的某些特定命令重新运行该进程。

我的问题是 - 如何用单个命令终止并重新运行该进程?

是否可以?

答案1

您可以获取 PID,然后读取该/prc/$pid/cmdline文件以查看用于启动它的命令:

pid=123
com=$(perl -pe 's/\0/ /g' /proc/$pid/cmdline)
kill 123 && "$com"

所以你可以把它变成一个函数:

restartPid(){
    pid=$1
    com=$(perl -pe 's/\0/ /g' /proc/"$pid"/cmdline)
    kill 123 && "$com"
}

但是,这对于在特定环境下运行命令的更复杂的情况不起作用。您可以开始进行更多创建并扩展它以将环境包括在内,如下所示:

restartPid(){
  pid=$1
  tempFile=$(mktemp)
  perl -pe 's/\0/\n/g' /proc/"$pid"/environ |
    perl -pe 's/^([^=]+)=(.*)/$1="$2"/' > "$tempFile"
  read -r com args < <(perl -lne '@k=split(/\0/); print "$k[0] ",  join " ", map "\"$_\"", @k[1..$#k]' /proc/"$pid"/cmdline)
    dir=$(readlink -f "/proc/$pid/cwd")    
    kill $pid
    ( . \"$tempFile\"; cd "$dir"; eval $com $args )
}

然而,正如您所看到的,这变得非常复杂,我不能保证它总是有效。不过应该是一个好的开始。

相关内容