/proc/[pid]/exe

49 views
Skip to first unread message

DaboD

unread,
Jun 21, 2014, 9:36:37 PM6/21/14
to sh...@googlegroups.com
一直以為它只是個 symlink... 直到剛才才知道這個檔案這麼神奇

早上 Gentoo 更新了 tmux 後發現連不上先前的 session 了, 因為 protocol version 不同. 上網一找, 在 Google+ 上發現人家的解法
$ pid=$(pgrep tmux)
$ /proc/$pid/exe attach

man proc 中說這玩意的功能用法之一
You can even type /proc/[pid]/exe to run another copy of the same executable as is being run by process [pid]

也就是 disk 上是新版的 tmux, 但通過這個 symlink 可以執行到內存中當初產生 process 的 executable.

大一點的 executable 也能這麼搞嗎?

AR

unread,
Jun 21, 2014, 10:43:56 PM6/21/14
to sh...@googlegroups.com
2.2 之后是这样的,不过后面也说了

> In a multi‐threaded process, the contents of this symbolic link are
> not available if the main thread has already terminated (typically by
> calling pthread_exit(3)).

另外,tmux 这种程序比较小,一个 binary 就包含所有了所以没问题。
如果是需要另外加载 lib 的恐怕是不行的,毕竟磁盘上文件已经变了。

--
Silence is golden.

依云

unread,
Jun 21, 2014, 10:45:13 PM6/21/14
to sh...@googlegroups.com
On Sat, Jun 21, 2014 at 06:36:37PM -0700, DaboD wrote:
> 一直以為它只是個 symlink... 直到剛才才知道這個檔案這麼神奇
>
> 早上 Gentoo 更新了 tmux 後發現連不上先前的 session 了, 因為 protocol version 不同. 上網一找, 在
> Google+ 上發現人家的解法
> $ pid=$(pgrep tmux)
> $ /proc/$pid/exe attach

啊,这个好棒!我当初没想到用这个呢,只好自己又去把旧版本下回来留着用……

> man proc 中說這玩意的功能用法之一
> You can even type /proc/[pid]/exe to run another copy of the same executable
> as is being run by process [pid]
>
> 也就是 disk 上是新版的 tmux, 但通過這個 symlink 可以執行到內存中當初產生 process 的 executable.
>
> 大一點的 executable 也能這麼搞嗎?

可以的。这个链接是链接到磁盘上的(可能已删除的)文件的,和
/proc/[pid]/fd 下边那些数字一样。

--
Best regards,
lilydjwg

Linux Vim Python 我的博客:
http://lilydjwg.is-programmer.com/
--
A: Because it obfuscates the reading.
Q: Why is top posting so bad?

Shell Xu

unread,
Jun 22, 2014, 10:22:58 PM6/22/14
to shlug
proc下面的很多文件,更像是硬链接,指向的是实际的inode。而非符号链接那样,指向的位置。这就导致你删除原文件建立新文件后,可以通过仍在运行的进程的proc找到原始文件。例如上次有人出了一个数据库问题,数据文件被删除。事后在总结里面感慨的第一点就是不专业,上去就重启了数据库。如果没重启,可以通过/proc/pid/fd来找到原始内容。


--
-- You received this message because you are subscribed to the Google Groups Shanghai Linux User Group group. To post to this group, send email to sh...@googlegroups.com. To unsubscribe from this group, send email to shlug+un...@googlegroups.com. For more options, visit this group at https://groups.google.com/d/forum/shlug?hl=zh-CN
---
您收到此邮件是因为您订阅了Google网上论坛中的“Shanghai Linux User Group”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到shlug+un...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout



--
彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
blog: http://shell909090.org/blog/

孑影

unread,
Jun 22, 2014, 11:49:48 PM6/22/14
to sh...@googlegroups.com
指向的是inode ,那能不能将这个备份起来,这个文件没有删除 是不是就可以算简单备份了。
#风起看云涌,叶落品人生#

DaboD

unread,
Jun 23, 2014, 2:50:56 AM6/23/14
to sh...@googlegroups.com
嗯, Windows 下檔案開啟或是執行中就會被 lock, 造成 upgrade 時要不是停掉目前的 process, 要不就等重啟時一併更新. Linux 下的 distro 更新似乎都是直接上, 看來這個機制似乎可以確保問題的發生.

不過我還是碰過像是 firefox, chrome 在更新後執行中的 process 就出了問題, 所以似乎能確保的部份有限? 還是說是相依的 library 或 extension 的 binary incompatible 造成的?

如果更新動作是直接 override 目前檔案內容, 而非創建新檔後 replace, /proc/[pid]/exe attach 這個方式應該就沒辨法了是嗎?

On Monday, June 23, 2014 10:22:58 AM UTC+8, shell909090 wrote:
proc下面的很多文件,更像是硬链接,指向的是实际的inode。而非符号链接那样,指向的位置。这就导致你删除原文件建立新文件后,可以通过仍在运行的进程的proc找到原始文件。例如上次有人出了一个数据库问题,数据文件被删除。事后在总结里面感慨的第一点就是不专业,上去就重启了数据库。如果没重启,可以通过/proc/pid/fd来找到原始内容。
2014-06-22 9:36 GMT+08:00 DaboD <daid...@gmail.com>:
一直以為它只是個 symlink... 直到剛才才知道這個檔案這麼神奇

早上 Gentoo 更新了 tmux 後發現連不上先前的 session 了, 因為 protocol version 不同. 上網一找, 在 Google+ 上發現人家的解法
$ pid=$(pgrep tmux)
$ /proc/$pid/exe attach

man proc 中說這玩意的功能用法之一
You can even type /proc/[pid]/exe to run another copy of the same executable as is being run by process [pid]

也就是 disk 上是新版的 tmux, 但通過這個 symlink 可以執行到內存中當初產生 process 的 executable.

大一點的 executable 也能這麼搞嗎?

--
-- You received this message because you are subscribed to the Google Groups Shanghai Linux User Group group. To post to this group, send email to sh...@googlegroups.com. To unsubscribe from this group, send email to shlug+un...@googlegroups.com. For more options, visit this group at https://groups.google.com/d/forum/shlug?hl=zh-CN
---
您收到此邮件是因为您订阅了Google网上论坛中的“Shanghai Linux User Group”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到shlug+unsubscribe@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

依云

unread,
Jun 23, 2014, 3:05:28 AM6/23/14
to sh...@googlegroups.com
On Sun, Jun 22, 2014 at 11:50:56PM -0700, DaboD wrote:
> 嗯, Windows 下檔案開啟或是執行中就會被 lock, 造成 upgrade 時要不是停掉目前的 process, 要不就等重啟時一併更新.
> Linux 下的 distro 更新似乎都是直接上, 看來這個機制似乎可以確保問題的發生.
>
> 不過我還是碰過像是 firefox, chrome 在更新後執行中的 process 就出了問題, 所以似乎能確保的部份有限? 還是說是相依的
> library 或 extension 的 binary incompatible 造成的?

可执行文件本身肯定可以得到,库文件理论上也有办法得到,但是资源文件(XUL、
JS、CSS 之类的)就没办法了。而且路径信息也没有了。

> 如果更新動作是直接 override 目前檔案內容, 而非創建新檔後 replace, /proc/[pid]/exe attach
> 這個方式應該就沒辨法了是嗎?

这个方式的话,对库文件做,相关进程可能会立即崩溃。对可执行文件做,会得到
「文本文件忙」的错误。见:http://en.chys.info/2009/05/install-vs-cp-and-mmap/

DaboD

unread,
Jun 23, 2014, 5:54:10 AM6/23/14
to sh...@googlegroups.com
Cool!
Reply all
Reply to author
Forward
0 new messages