如何在启动时自动启动应用程序


27

我是Linux新手,很期待启动应用程序(每10秒切换一次led)。我已经编写了应用程序,并且运行良好,但是现在我想在启动时自动启动它。

这里的文档说将启动脚本复制到/etc/init.d目录,并在目录中建立指向复制脚本的符号链接rc.d

这些脚本文件的扩展名和名称应该是什么?我们可以在其中手动添加符号链接rc.d吗,或者有一些特定的过程吗?

有什么建议如何实现吗?


向发行版添加初始化脚本的首选方法因发行版而异。有些人甚至逐步淘汰它们,以支持新贵和系统化。我不建议仅在背景中使用“&”,因为Debian的start-stop-daemon处理方式会更好(尽管它最好由程序自己来守护)。您正在使用什么发行版?在桌面MIME类型之外,文件扩展名在* nix中是没有意义的,它优选可执行文件没有扩展名。
jordanm 2012年

如果您使用的是花瓣花瓣,则只需遵循该文档-无需特殊名称,只需按照他们的指示进行即可。你试过了吗?你有什么问题?(如果没有,请指定您的发行版,并说明您尝试使用的发行版无效。)
2012年

我正在为RPi使用Debian“ wheezy”。
峡谷2012年

1
如果您需要大约每10秒(即不急于10秒)执行一次,则可能要使用它cron
彼得2012年

@peterph:但是听起来程序每10秒切换一次LED,而不是每10秒执行一次的程序。
Zorawar 2012年

Answers:


19

这是来自http://www.debian-administration.org/articles/28的摘录,它似乎可以回答您的问题。

注意:在下面的示例脚本中,只需在“ start)”部分添加一个调用即可实际启动程序。您可以在不重新启动系统的情况下测试脚本的功能:以完整路径调用它,并为其指定参数“ start”或“ stop

开始:

当系统运行级别更改时,例如在启动和关闭时,Debian使用类似于Sys-V的init系统执行命令。

如果希望添加新的服务以在计算机启动时启动,则应在目录中添加必要的脚本/etc/init.d/。该目录中已经存在的许多脚本将为您提供可以执行的操作示例。

这是一个非常简单的脚本,分为两个部分:始终运行的代码,以及通过“开始”或“停止”调用时运行的代码。

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

将文件保存到正确的位置后,请通过运行“ chmod 755 /etc/init.d/blah” 确保其可执行。

然后,您需要添加适当的符号链接,以使脚本在系统停机或启动时执行。

最简单的方法是使用Debian特定的命令update-rc.d

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah

我是否必须将这个脚本实际放置在etc / init.d /中,还是最上面的行#/etc/init.d/blah指示了外壳的位置?
user137717

我收到“ -sh:update-rc.d:找不到命令”
m4l490n17年

2
较新的系统可systemd用于许多方面,包括启动配置。使用systemctl控制和配置systemd
Alexander Shcheblikin

4

最好的方法是检查发行版的软件包源是否有常规的系统服务,例如针对OpenSSH的软件包-您将了解良好的做法。毕竟,开放源代码背后的原因之一是能够向源代码学习。


2
极好的建议!真正明智且相关,并调适至所有Disto。(顺便回答了问题的“ Linux的新手”和“我该怎么做”部分。我将使用该答案来改善我的启动停止脚本
。– Bruce0

3

使用Supervisor,这是一个有效的程序,用于管理和记录带有参数的启动应用程序。从http://supervisord.org/running.html和(按照安装说明进行操作。

在创建一个conf文件,/etc/supervisor/conf.d/{PROGRAM_NAME}.conf这是代码,

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

然后从cmd行执行:

supervisorctl reload


尽管您的回答很好,但我认为您应该更改它以表明将从CLI执行“ supervisorctl reload”,而不是将其插入.conf文件中
dlewin,

3

使用crontab起来容易得多。

使用crontab -e以编辑用户的crontab。
在末尾添加以下行:

@reboot <command>

例子:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

最后使用crontab -l以确保您的脚本已添加到列表中。


我不知道为什么这个答案被否决了?似乎是一个非常简单的解决方案,并且使用了crontab-可能每个人都已经知道和理解。
kolinko

1

较新版本的Linux 支持 systemd(如@AlexanderShcheblikin所说)。它比debian专用解决方案具有更多功能,并且更易于移植。

请阅读 这个非常好的指南

以下是所需最低要求的快速参考:

  1. myscript.sh具有可执行权限的脚本(例如)。
  2. 具有644权限的myservice.service扩展名为“ .service” 的单元文件(例如)/etc/systemd/system,包含执行脚本的命令。例如,

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. 运行命令sudo systemctl enable myservice以使其能够在启动时启动。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.