![将 shell 脚本作为守护进程运行的启动脚本](https://linux22.com/image/97853/%E5%B0%86%20shell%20%E8%84%9A%E6%9C%AC%E4%BD%9C%E4%B8%BA%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E8%BF%90%E8%A1%8C%E7%9A%84%E5%90%AF%E5%8A%A8%E8%84%9A%E6%9C%AC.png)
我正在使用 Debian Stretch 和 systemd 版本 231-9。
即使我注销时,我也需要在后台运行一些 shell 脚本和非守护程序。
我曾经使用 LSB 标头制作简单的 init.d 脚本,然后使用启动选项来简单地执行“my_script.sh >> /var/log/my_script.log 2>&1 &”以在后台运行 my_script.sh,但现在 Systemd一旦我关闭终端,无论我尝试什么,都会杀死它们:&、nohup、setsid、disown。
您能帮我提供一个正确的 init.d 脚本的配方,使任何脚本或非守护程序程序作为守护程序运行吗?
谢谢。
答案1
如果您的东西由 root 用户拥有,那么/etc/rc.local
:
screen -dmS ThingOne /path/to/thing-one
screen -dmS ThingTwo /path/to/thing-two
或者,对于任何用户(包括 root),在 cron 表中:
@reboot screen -dmS ThingOne /path/to/thing-one
# et cetera
答案2
这是将脚本设置为守护进程的方法:
#! /bin/sh
### BEGIN INIT INFO
# Provides: foobar
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: foobar
# Description: more foo for your bars
### END INIT INFO
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting foobar "
# example 1 - system service
# /usr/bin/foobar --config /etc/foo.conf start
# example 2 - run script as user
# su --login mkaz --command "/home/mkaz/bin/my-script --cmd-args"
;;
stop)
echo "Stopping foobar"
# example 1
# /usr/bin/foobar --config /etc/foo.conf stop
;;
*)
echo "Usage: /etc/init.d/foobar {start|stop}"
exit 1
;;
esac
exit 0
然后将脚本移至 init.d 文件夹并将其设置为可执行文件
sudo mv foobar /etc/init.d/ # move to init.d
sudo chmod 755 /etc/init.d/foobar # make executable
如果您想在启动时启动脚本:
update-rc.d foobar defaults
如果您想从启动中删除脚本:
update-rc.d -f foobar remove
如果您想手动启动脚本:
service foobar start
来源 :https://debian-administration.org/article/28/Making_scripts_run_at_boot_time_with_Debian