1

fuser は、元のファイルが使用中の場合にのみ表示できます。

元のファイルを呼び出す SYMLINK が使用されている場合、フューザーは表示されません。それが問題です。シンボリックリンクが使用されておらず、削除できるかどうかはわかりません。

私は2つのプロセスを開始しました(24261は元のファイルを開き、24262はシンボリックリンクを開きました):

root@server DEV # ls -l /lib64/libgcc_s-4.4.7-20120601.so.1
-rwxr-xr-x 1 root root 93320 Sep  1  2014 /lib64/libgcc_s-4.4.7-20120601.so.1
root@server DEV # ls -l /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
lrwxrwxrwx. 1 root root 20 Oct 19  2015 /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so -> /lib64/libgcc_s.so.1
root@server DEV #
root@server DEV # tail -f /lib64/libgcc_s.so.1 &
[1] 24261
root@server DEV #
root@server DEV # cd /usr/lib/gcc/x86_64-redhat-linux/4.4.4
root@server DEV # tail -f libgcc_s.so &
[2] 24262
root@server DEV #
root@server DEV # ps -ef | grep tail
root     24261  3265  0 13:39 pts/1    00:00:00 tail -f /lib64/libgcc_s.so.1
root     24262  3265  0 13:39 pts/1    00:00:00 tail -f libgcc_s.so
root     24492  3265  0 13:40 pts/1    00:00:00 grep tail
root@server DEV #

どちらの場合も、fuser はシンボリック リンクと元のファイルが使用中であることを通知します (コマンドごとに 2 つのプロセスがあります)。

root@server DEV # fuser /lib64/libgcc_s.so.1
/lib64/libgcc_s.so.1: 24261 24262
root@server DEV # fuser /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so: 24261 24262
root@server DEV #

しかし、最初のプロセスでシンボリックリンクが使用されていないことがわかっています。削除することもでき、最初のプロセスには影響しません。

パッケージが使用されていない場合、「gcc」パッケージを削除したいとしましょう。

元のファイルは「libgcc」パッケージから取得されます。

root@server DEV # rpm -qf /lib64/libgcc_s.so.1
libgcc-4.4.7-11.el6.x86_64

シンボリックリンクは「gcc」パッケージからのものです:

root@server DEV # rpm -qf /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
gcc-4.4.7-11.el6.x86_64

symlink だけを含む 'gcc' パッケージを削除すると、2 番目のプロセスに影響します。シンボリックリンクが使用されていないかどうかを確認するにはどうすればよいですか?

私の場合、「ps -ef」は、コマンドを使用したことを示しています。

root     24262  3265  0 13:39 pts/1    00:00:00 tail -f libgcc_s.so

したがって、ps はシンボリックリンクが使用されたことを伝えることさえできません。

Linuxの達人はいますか?

EDITED:cwdをチェックする部分的な解決策があります-現在の作業ディレクトリ:

root@server DEV # ls -l /proc/24262/cwd
lrwxrwxrwx 1 root root 0 Jun 20 13:57 /proc/24262/cwd -> /usr/lib/gcc/x86_64-redhat-linux/4.4.4
root@server DEV #

したがって、ここからパス「/usr/lib/gcc/x86_64-redhat-linux/4.4.4」が表示され、ps からファイル名を取得できます。

次の場合、これは機能しません。

root@server DEV # cd /root
root@server DEV # cat script.sh
/usr/bin/tail -f /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
root@server DEV #
root@server DEV # nohup ./script.sh &
[2] 26713
root@server DEV #
root@server DEV # ls -l /proc/26713/cwd
lrwxrwxrwx 1 root root 0 Jun 20 14:32 /proc/26713/cwd -> /root

/rootのcwdを示していますが、シンボリックリンクはスクリプト/プログラム内にあります。そのため、/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so の ps chill プロセスを確認する必要があります。

root@server DEV # ps -ef | grep 26713
root     26713  3265  0 14:32 pts/1    00:00:00 /bin/sh ./script.sh
root     26714 26713  0 14:32 pts/1    00:00:00 /usr/bin/tail -f /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
root     26780  3265  0 14:38 pts/1    00:00:00 grep 26713
root@server DEV #

パッケージの削除を自動化したい場合 (パッケージが使用されていない場合)、これは非常に混乱を招きます。

誰かがこれのより簡単な方法を見ることができれば素晴らしいでしょう。また、使用中のシンボリックリンクの検出に cwd および ps 子プロセスを使用することの正確性を誰かが確認できる場合。

script.sh がバイナリ ファイルの場合はどうなりますか? 「ps」または cwd で完全なシンボリック リンク パスを表示することはできますか?

4

4 に答える 4

0

この質問の前提 (未使用のパッケージをfuser/で識別するlsof) には根本的な欠陥があります。

システムが適切に動作するために必要なすべてのファイルが、開いているファイル記述子によってランダムに参照されるわけではありません。

/bin/systemctlたとえば、 ( のようなものはそれへのシンボリックリンクであるため)削除した場合は悪い時間を/sbin/shutdown過ごすことになりますが、lsof はそれを使用して何も表示しません。

/bin/grep私のシステムのように、さらに多くの例を思いつくのは簡単です。これはシェル スクリプトのいたるところで使用されていますが、実行時間の長いインスタンスはありません。

于 2016-07-02T00:07:58.703 に答える
0

残念ながら、Linux カーネルは、起動段階でシンボリック リンクから元のファイルを割り当てるように設計されています。そのため、プロセスが実行されている場合、ファイルが直接またはシンボリックリンクを介して呼び出されたかどうかを確認する可能性はありません。

あなたができることは、現在の作業ディレクトリls -l /proc/<process_id>/cwd、コマンドライン引数strings /proc/<process_id>/cmdline、プロセスを開始したユーザーps -ef | grep <process_id>を確認することだけです。次に、ユーザーの起動スクリプトを確認し$PATHldd特定のライブラリから呼び出されたライブラリを表示できます。プロセスを再起動して、呼び出されたシンボリックリンクstraceがあなたの友人であるかどうかを確認したい場合。

于 2016-06-21T10:17:20.303 に答える