linux - 从 bash 脚本启动进程时的不同 pid
问题描述
我正在编写init.d
脚本,但在保存分叉进程 pid 时遇到了一些问题。
这是我的初始化脚本片段:
sudo -u $USER nohup -- nice -n "0" java Test >> /dev/null 2>&1 < /dev/null &
NEWPID="$!"
echo $NEWPID
但是当我运行这个脚本时,我打印了以下 pid
$./scr.sh
4595
但
$ps | grep java
4596 pts/23 00:00:01 java
如您所见,pid
s 是不同的(4596
和4595
)。但是,如果尝试编写以下内容:
java Test &
NEWPID="$!"
echo $NEWPID
我得到了正确的结果:
$./scr.sh
4653
$ps | grep java
4653 pts/23 00:00:03 java
第一个有什么问题?
解决方案
在一个效率低下的世界中,将涉及多个过程:
<the shell> 1234
|
|
sudo 4595
|
|
nohup 4596
|
|
nice 4597
|
|
java 4598
$!
只指shell本身在后台启动的进程,也就是运行的进程sudo
。java
,您感兴趣的进程位于进程 4598 中。您需要使用ps
(或其他一些工具)来获取该进程 ID,因为 shell 不会知道它。
在现实世界中,涉及的进程并不多,因为并非上述链中的每个作业都必须派生一个新进程;其中一些可以简单地用exec
他们运行的程序替换自己。我认为这sudo
两者nice
都这样做(nohup
必须在不同的进程组中启动一个新进程才能完成它的工作)。所以链条看起来更像
<the shell> 1234
|
|
sudo/nohup 4595
|
|
nice/java 4596
但最终结果是一样的;shell 无法获取java
最终运行的进程的进程 ID。
推荐阅读
- mysql - 我如何找到所有科目超过 70 的学生?
- c++ - 空白通用 Windows 应用程序 - C++/CX 返回退出代码 1 (0x1)
- angular - Angular 9强制异步管道嵌套在ngIf异步管道中
- python - 如何使用 RichTextCtrl 事件?
- forms - 对函数进行 powershell 表单按钮调用
- ag-grid - 试剂中的floatingFilter有问题吗?
- google-chrome - WebM 视频格式 - 浏览器兼容性
- angular - 管道将字符串更改为其 JSON 转换角度的等效项
- angular - Ionic 5:删除 Pop 上的页面过渡
- css - Sass - 保持原始类嵌套