通常,我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 )
}
然而,正如您所看到的,这变得非常复杂,我不能保证它总是有效。不过应该是一个好的开始。