gpt4 book ai didi

command-line - #!/usr/bin/env 和进程名称 : portability at a price?

转载 作者:行者123 更新时间:2023-12-04 15:47:50 25 4
gpt4 key购买 nike

有很多good reasons使用 #!/usr/bin/env.底线:它使您的代码更具可移植性。嗯,有点。看一下这个....

我有两个几乎相同的脚本,bintest.py

#! /usr/bin/python
import time
time.sleep(5*60)

envtest.py
#! /usr/bin/env python
import time
time.sleep(5*60)

请注意,它们仅在 shebangs 上有所不同。 .
bintest.py按预期运行

br@carina:~$ ./bintest.py & ps && killall bintest.py
[1] 15061
PID TTY 时间命令
14625 点/0 00:00:00 重击
15061 分/0 00:00:00 bintest.py
15062 点/0 00:00:00 ps
br@carina:~$
[1]+ 终止 ./bintest.py

但是 envtest.py做一些不太理想的事情

br@carina:~$ ./envtest.py & ps && killall envtest.py
[1] 15066
PID TTY 时间命令
14625 点/0 00:00:00 重击
15066 分/0 00:00:00 python
15067 点/0 00:00:00 ps
envtest.py:找不到进程
br@carina:~$ killall python
br@carina:~$
[1]+ 终止 ./envtest.py


我们看到的是使用 #! /usr/bin/env导致进程收到名称“python”而不是“envtest.py”,从而呈现我们的 killall无效。在某种程度上,我们似乎已经将一种可移植性换成了另一种:我们现在可以轻松地更换 python 解释器,但我们已经失去了命令行上的“kill-ability”。那是怎么回事?如果这里有实现两者的最佳实践,那是什么?

最佳答案

命令行上的“kill-ability”可以通过使用从 shell $! 获得的后台进程的 PID 进行可移植且可靠的处理。多变的。

$ ./bintest.py & bg_pid=$! ; echo bg_pid=$bg_pid ; ps && kill $bg_pid
[1] 2993
bg_pid=2993
PID TTY TIME CMD
2410 pts/0 00:00:00 bash
2993 pts/0 00:00:00 bintest.py
2994 pts/0 00:00:00 ps
$
[1]+ Terminated ./bintest.py
$

和 envtest.py
$ ./envtest.py & bg_pid=$! ; echo bg_pid=$bg_pid ; ps && kill $bg_pid
[1] 3016
bg_pid=3016
PID TTY TIME CMD
2410 pts/0 00:00:00 bash
3016 pts/0 00:00:00 python
3017 pts/0 00:00:00 ps
$
[1]+ Terminated ./envtest.py
$

正如@Adam Bryzak 指出的那样,这两个脚本都不会导致在 Mac OS X 上设置进程标题。因此,如果该功能是一项严格要求,您可能需要安装和使用 python 模块 setproctitle与您的应用程序。

这篇 Stackoverflow 帖子讨论了 setting process title in python

关于command-line - #!/usr/bin/env 和进程名称 : portability at a price?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6495688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com