mkdir -p /package chmod 1755 /package cd /package
wget https://cr.yp.to/daemontools/daemontools-0.76.tar.gz #目前的下载地址是这个,不保证后续还是这个 !
解压: tar -zxvf daemontools-0.76.tar.gz
rm -rf daemontools-0.76.tar.gz
cd admin/daemontools-0.76
package/install #注意这里的package是admin/daemontools-0.76目录下面的package
./load envdir unix.a byte.a
/usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o
/lib64/libc.so.6: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [envdir] Error 1
vim src/conf-cc
# 在gcc 一行末尾增加
-include /usr/include/errno.h
# 更改后
gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings -include /usr/include/errno.h
Ubuntu16.04开机启动程序的命令是写在 /etc/rc.local文件中的。关于这块不懂的,请自行百度。
在步骤2中,我们通过package/install 安装成功以后,会在/etc/rc.local中写入下面一行命令:
csh -cf '/command/svscanboot &'
经过反复测试,发现这句话有问题,将其修改为:(这里也有可能与系统有关,可以自己先测试下)
/command/svscanboot &
特别注意:如果在/etc/rc.local中 有 exit 0 ,所有指令 都需要 写在 exit 0 前面。
这些都完成以后,我reboot了系统,使用命令ps -ef | grep svscan,发现系统中并没有运行daemontools。
最后发现问题出现在文件/etc/rc.local文件上。
在使用package/install安装完成后,daemontools删除了/etc/rc.local文件的执行权限。
使用命令 chmod 755 /etc/rc.local(root权限下),给/etc/rc.local添加执行权限。
reboot重启系统
ps -ef | grep svscan 现在就可以看到系统中运行了 daemontools。
daemontools的官方手册讲了很多东西,这里不详细说明。毕竟我们只是需要用daemontools来托管我们的程序,使其成为守护进程。
mkdir /home/test/daemontools
touch test1.c
gcc test1.c -o mytest
这里的test1.c,我写的是一个循环休眠程序:
#include
int main( void ){
while( 1 ){
sleep(20);
}
return 0;
}
安装好daemontools以后,会在/目录下生成一个service目录。
cd /service
mkdir mytest
在/service目录下创建的mytest目录中,自动会生成一个supervise目录,这个我们不需要管它。
在mytest目录下,执行touch run
vim run
#!/bin/bash
MY_RUN_PATH=/home/test/daemontools #设置程序所在的目录
cd $MY_RUN_PATH
ulimit -c unlimited #开启core文件
exec setuidgid test ./mytest #这里的mytest就是我生成的可执行程序,test是我登录系统时,
#使用的账户,如果你登录系统使用的用户是xxx,那这里就是xxx
chmod u+x run
到这里,就算成功了,此时daemontools 已经启动了mytest程序。
可以使用 ps -ef | grep mytest 进行查看,可以看到mytest已经在后台运行了。
因为daemontools会自动,周期性的运行在/service中定义的run文件,所以如果你想使用kill -9 进程号,去"杀死"某个进程,会失败。
这里会关闭所有交给 daemontools 进行托管的程序。
如果只需要关闭我们之前创建的mytest程序可以使用命令: sudo svc -d /service/mytest/
同理,如果只需要重启我们之前创建的mytest程序可以使用命令: sudo svc -du /service/mytest/