我试图在我的Debian Wheezy系统上创建服务。
尝试使用start-stop-daemon运行autossh时,pid文件中包含的pid与autossh进程不匹配。
$ AUTOSSH_PIDFILE=/var/run/padstunnel.pid
$ sudo start-stop-daemon --make-pidfile --background --name mytunnel --start --pidfile /var/run/mytunnel.pid --exec /usr/lib/autossh/autossh -- -M 0 -p 22 user@server -f -T -N -R 31022:localhost:31222
$ ps -elf |grep autossh
1 S root 447 1 0 80 0 - 329 pause 19:07 ? 00:00:00 /usr/lib/autossh/autossh -M 0 -p 22 ...
$ cat /var/run/mytunnel.pid
446
此行为可防止使用start-stop-daemon停止
autossh
或使用pidfile中的pid杀死它。请问这种行为有什么原因吗?
如何解决它并使autossh的pid与pidfile匹配?
最佳答案
我发现的解决方案受到this answer的启发。
实际上,AUTOSSH_PIDFILE
不能使用autossh
变量(因为start-stop-daemon在不同的环境中运行)。
所以解决方法是使用:
$ sudo start-stop-daemon --background --name mytunnel --start --exec /usr/bin/env AUTOSSH_PIDFILE="/var/run/mytunnel.pid" /usr/lib/autossh/autossh -- -M 0 -p 22 user@server -f -T -N -R 31022:localhost:31222
/usr/bin/env AUTOSSH_PIDFILE="/var/run/mytunnel.pid"
正确定义了必要的环境变量--make-pidfile
不再需要--pidfile
和start-stop-daemon
sudo start-stop-daemon --pidfile /var/run/mytunnel.pid --stop
现在可以杀死autossh
--background
选项使ssh
的-f
成为可选(如果使用-f
,则是否使用--background
不会更改任何内容)行为的原因对我来说还不是很清楚。但是,似乎
autossh
在看不到ssh
变量时会自动创建多个进程来正确处理AUTOSSH_PIDFILE
实例。编辑:
从服务初始化脚本(在/etc/init.d/servicename中)使用它时,必须修改语法:
sudo start-stop-daemon --background --name mytunnel --start --exec /usr/bin/env -- AUTOSSH_PIDFILE="/var/run/mytunnel.pid" /usr/lib/autossh/autossh -M 0 -p 22 user@server -f -T -N -R 31022:localhost:31222
请注意,
--
必须紧接在/usr/bin/env命令之后(在命令行的/usr/lib/autossh/autossh之后)。