
我需要知道如何殺死登入使用者的所有進程,除了 linux redhat 6 中的第一個進程。
例如,AZain
用戶從不同的電腦多次登錄,因此我只需要允許第一個進程並殺死該用戶的所有其他進程:
who -u
AZain pts/2 2016-06-23 08:34 . 27191 (localhost)
AZain pts/4 2016-06-23 09:01 . 28885 (localhost)
root pts/0 2016-06-23 08:14 . 25962 (10.11.155.23)
AZain pts/1 2016-06-23 08:34 00:27 27169 (10.11.155.23)
AZain pts/3 2016-06-23 09:01 . 28867 (10.11.155.14)
編輯:我正在嘗試這樣做,因為我有一個使用使用者許可證的應用程式。因此,同一用戶的每個新會話都會消耗更多許可證。如果我可以阻止同一用戶的任何新登錄,那就太好了。
答案1
這是經典XY問題- 您試圖限制每個使用者執行的許可軟體的實例數量,但您的重點是限制 shell 登入。這是一個錯誤的問題。
更好的解決方案是:
重新命名程序,例如從
/usr/local/bin/foo
到/usr/local/bin/foo.real
編寫一個與原始程式同名和路徑的包裝腳本(例如
/usr/local/bin/foo
)來檢查使用者是否已經在運行它。如果是,則退出並顯示相應的錯誤訊息。如果沒有,則運行原始程式(
/usr/local/bin/foo.real
)
一個非常簡單的例子:
#! /bin/sh
if pgrep -u "$USER" foo.real >/dev/null 2>&1 ; then
echo "You are already running foo" >&2
exit 1
else
foo.real
fi
注意:這適用於了解許可問題並且不介意遵守規則的行為良好的用戶。它不會阻止狡猾的用戶foo.real
自行運行。您可以透過添加 或 來阻止偷偷摸摸但不是很聰明alias foo.real=foo
的/etc/profile
用戶/etc/bash.bashrc
。
您可以執行一個根 cron 作業,該作業偵測到foo.real
正在執行的實例沒有稱為foo
父進程的 shell 腳本。 cron 作業可能會殺死任何此類實例和/或透過電子郵件向您發送警告(為了避免給自己發送垃圾郵件,請追蹤foo.real 的進程ID,並且不要向自己發送有關同一PID 的多個警告)。
順便說一句,如果您的許可軟體附帶某種許可證管理器,請檢查其文件以查看它是否可以限制每個使用者的實例數量。