我运行使用命令来运行su -s
命令来启动进程。因为我不希望 root 用户拥有该进程。
我尝试通过发出命令来做到这一点
su -s "$CATALINA_HOME/bin/catalina.sh run" tomcat
返回su: /opt/apache-tomcat/bin/catalina.sh run: No such file or directory
如何运行su -s
带有参数的命令而不生成此错误?
答案1
如果你正在跑步su
as root
,您可以用来-s
指定不同的 shell(root
此处根据需要运行,因为您的tomcat
用户没有有效的 shell),并-c
指定要运行的命令:
su -s /bin/sh -c "$CATALINA_HOME/bin/catalina.sh run" tomcat
你可能会发现start-stop-daemon
有用;它有很多选项来指定要使用的用户和组、如何启动守护进程等。tomcat8
初始化脚本在 Debian 中使用可能会提供有用的灵感。或者您可以考虑编写一个 systemd 单元或任何适合您系统 init 的单元。
答案2
-s
命令的开关是su
改变指定用户的shell。您要运行的命令前面必须带有-c
switch。
所以你正在寻找的命令是这样的:
su -s /bin/bash -c "$CATALINA_HOME/bin/catalina.sh run" tomcat
答案3
您的其他问题请访问https://stackoverflow.com/questions/37753783/和有没有办法判断 shell 脚本是否被信号 9 杀死表明您的问题缺少的是您正在尝试在 upstart 下运行 Tomcat。
在这种情况下:
start-stop-daemon
不合适。- 也不是
su
。 - Poor Man's Daemon Supervisor 也不会在 shell 脚本中进行 PID 文件管理。
所有这些都试图复制暴发户所做的事情直接地。使用起来su
特别糟糕,因为它不是删除特权的工具。它是一个工具添加权限,在登录会话中。如今,它在幕后参与了各种登录会话管理子系统,这使得它特别不适合在守护程序中删除超级用户权限的(简单得多)任务。 start-stop-daemon
只是多余的。和新贵知道进程 ID它的孩子。
在 upstart 作业文件中,使用setuid
和 (如果适用)setgid
节来删除非特权用户的特权:
setuid 雄猫
如果您确实调用了catalina.sh
via sh -c
(这并不是真正必要的),请不要陷入 systemd House of Horror 领域。 (当这些事情由 upstart 完成时,情况只会稍微不那么可怕。)以 daemontools 的方式做事,并将 shell 链连接到脚本,通过 shell 的exec
命令调用它,以便 upstart 将守护进程视为其直接子进程。 (并确保暴发户expect
也知道这一点并使用正确的节。)
不过,显式 shell 并不是必需的,因为 upstart 可以catalina.sh
直接调用自身,就像 systemd 和其他服务管理工具一样。因此,您不必担心确保该解释器/bin/bash
实际上是该脚本的正确解释器。
执行 $CATALINA_HOME/bin/catalina.sh 运行
进一步阅读
- 詹姆斯·亨特和克林特·拜鲁姆 (2014)。 ”
setuid
“。 新贵食谱。 - 詹姆斯·亨特和克林特·拜鲁姆 (2014)。 ”
setgid
“。 新贵食谱。 - 詹姆斯·亨特和克林特·拜鲁姆 (2014)。 ”
console log
“。 新贵食谱。 - 乔纳森·德博因·波拉德 (2014)。 请勿滥用
su
删除用户权限。 经常给出的答案。 - 乔纳森·德博因·波拉德 (2015)。将 Apache Tomcat 包装在许多无意义的额外层中 systemd 恐怖屋。
- 乔纳森·德博因·波拉德 (2015)。 systemd 恐怖屋。常见答案。
- https://superuser.com/a/723333/38062
- https://superuser.com/questions/683855/