📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019年1月10日)|问题18(1)

📅  最后修改于: 2023-12-03 15:42:19.767000             🧑  作者: Mango

题目说明

该题是Sudo GATE 2020 Mock II(2019年1月10日)的第18题,涉及Linux系统管理的基本知识,主要围绕“门”的利用展开。

题目描述

假设有一个Linux系统,其中有一个用户“Alice”,需要对一个叫“door”的进程开放的门进行管理。在管理过程中,我们需要实现两种功能:

  1. 提供进入门和退出门的功能,即访问和禁用门;
  2. 给与其他用户或进程在门上锁的权限。

请编写一个Shell脚本,实现上述功能。

解题思路
  1. 利用Linux系统中的chmod命令来实现权限管理;
  2. 利用ps aux命令来查找“door”进程并获取其进程ID,然后利用kill命令来关闭进程;
  3. 利用trap命令来捕捉信号,以便在门被关闭时相应地做出响应。
解题步骤
  1. 创建一个可读可写的文本文件“door.txt”,并在其中写入“open”文本;
  2. 利用chmod命令将此文件的权限设置为“777”,即所有用户都具有读写执行的权限;
chmod 777 door.txt
  1. 利用ps aux命令查找“door”进程,并获取其进程ID,然后利用kill命令杀死进程;
pid=$(ps aux | grep 'door' | grep -v 'grep' | awk '{print $2}')
kill -9 $pid
  1. 利用trap命令来捕捉SIGHUP、SIGINT和SIGTERM信号,并在接收到信号时执行相应的操作。具体来说,当收到SIGHUP信号时,脚本将读取“door.txt”文件中的内容(如果进程还在),并将门关闭。当收到SIGINT和SIGTERM信号时,将门关闭并退出脚本。
trap "{
    if [ -n \"$pid\" ]; then
        echo \"Closing the door\"
        echo \"closed\" > door.txt
        kill -HUP $pid
    fi
}" SIGHUP SIGINT SIGTERM
  1. 在Shell脚本中,增加一个循环,使得脚本能够在门保持打开状态时一直运行下去。
while [ -f "door.txt" ] && [ "$(cat door.txt)" == "open" ]
do
    echo "Door is open."
    sleep 1
done

echo "Door is closed."
总结

以上五个步骤是实现一个利用Shell脚本管理Linux进程“door”的门的基本流程。其中,第一个和第二个步骤与操作系统底层的权限管理系统相关,我们需要在Shell脚本中调用相应的系统命令来设置文件的权限和杀死进程;第三个和第四个步骤与Shell脚本语法相关,我们需要利用trap命令来捕捉信号并执行相应的操作;第五个步骤则是通过一个循环来保证脚本能够在门保持打开状态时一直运行下去。