为普通用户(非root用户)提供初始化和关闭自动运行功能

Modified on: Tue, 30 Jul 2019 21:40:02 +0800

我正在托管一个实验/测试Linux机器,运行Debian Wheezy 7.4.0发行版。不同的用户通过ssh登录到他们的帐户,并允许他们运行开发工具,如果他们愿意,可以将他们的程序作为服务在后台运行。

由于这是一个用于各种目的的测试机器,因此通常需要重新启动整个机器,然后用户必须重新登录并重新启动正在运行的用户空间内容。
我想自动化。基本上我想为用户提供一个意思,即在机器启动后(在其他所有内容初始化之后)启动内容并在系统关闭时启动内容(没有时间限制,基本上停止关闭直到所有关闭用户流程已经完成。)

到目前为止我尝试了什么:
我已经按照/etc/init.d/下的'骨架'模板文件中的原则创建了一个init bash脚本(Skeleton模板源代码:https://gist.github.com/ivankovacevic/9917139

我的代码在这里:
https://github.com/ivankovacevic/userspaceServices

基本上,脚本遍历用户主目录,并在名为.startUp,.shutDown或.status的相应子目录中查找可执行文件。根据当前正在进行的事件,脚本将使用su执行,就好像用户已经自己启动它们一样。

我目前面临的问题是,在系统启动并且脚本启动其他用户的所有进程后,会出现一个奇怪的进程。这是它在进程列表中的外观:

UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root      3053     1  0  1024   620   1 17:42 ?        00:00:00 startpar -f -- userspaceServices

我不知道那个进程是什么,并且man的页面没有提到-f参数。所以我很无能,但我必须做错事,因为init.d中没有其他脚本/服务在启动后会挂起这样的进程。

所以我正在找人帮我调试我的解决方案(在我看来这似乎有点复杂)。或者让我知道如何以完全不同的方式实现这一点。

更新强>
我已经针对startpar问题启动了一个单独的问题:
startpar进程在启动时挂起来自rc.local或init.d的进程

更新2
我原来的解决方案解决了问题。检查前面提到的startpar问题。 GitHub上的代码也经过修正以反映出来。

更新3 - 如何使用crontab
正如Jenny建议的那样,普通用户可以使用crontab计划在启动时执行一次任务。我发现这是最简单的方法,如果您只需要在启动时启动用户任务而不是关闭。但是,当用户启动正在进行的类似服务的任务时,用户可以将cron进程“挂起”作为父进程。首先让我解释它是如何工作的:

普通用户自己应该致电:

crontab -e

(-e与编辑一样)
这将打开一个默认的控制台文本编辑器及其用户crontab文件。要添加要在引导时执行的任务,用户必须在文件末尾添加一行:

@reboot /path/to/the/executable/file

现在,如果用户会这样做,并且该文件不仅仅是一些线性完成某些内容并结束的简单脚本,而是某种看门狗,例如,在重新启动后,您将在进程列表中以类似的方式结束:

    1  2661 root       20   0 20380   860   660 S  0.0  0.0  0:00.00 ├─ /usr/sbin/cron
 2661  2701 root       20   0 33072  1152   868 S  0.0  0.0  0:00.00 │  └─ /USR/SBIN/CRON
 2701  2944 someuser   20   0  4180   580   484 S  0.0  0.0  0:00.00 │     └─ /bin/sh -c ./watchdog
 2944  2945 someuser   20   0 10752  1204  1016 S  0.0  0.0  0:00.00 │        └─ /bin/bash ./watchdog
 2945  2946 someuser   20   0 23696  4460  2064 S  0.0  0.1  0:00.01 │           └─ /usr/bin/python ./some_program.py

为避免用户需要修改他的crontab条目,如下所示:

@reboot /path/to/the/executable/file >/dev/null 2>&1 &

文件描述符的重定向是可选的,但建议保持干净。如果你想研究原因,试着看看它们:

ls -l /proc/pid_of_started_process/fd

最佳答案

我同意你的解决方案似乎有点复杂,所以我会选择“让我知道如何以完全不同的方式实现这一点”: - )

  1. 此标准解决方案是使用配置管理系统(如puppet),并允许用户将其内容添加到服务器的puppet配置中。然后Puppet将推出启动脚本并将它们添加到相关的运行级别。

  2. 更快捷的方法是让他们对/etc/rc.d/rc.local进行sudoedit访问并在那里添加他们的东西。

  3. 或者给每个目录放置他们想要启动的启动脚本,并让cron作业将这些脚本复制到/etc/init.d,插入su $USER -c并在它们上运行chkconfig。

  4. 或者给每个目录放置启动脚本,并在/etc/rc.d/rc.local的末尾添加一些行来浏览这些目录并运行已编辑 su $USER -c 'script start',其中包含每个脚本。

  5. 醇>

    编辑添加:
    5.让他们使用crontab来安排要运行的作业@reboot

作者:,Jenny D

相关问答

添加新评论