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 で完全なシンボリック リンク パスを表示することはできますか?