使用start-stop-daemon时,autossh pid不等于pidfile中的pid

时间:2015-12-04 18:14:01

标签: linux ssh debian autossh

我正在尝试在Debian Wheezy系统上创建服务。

尝试使用start-stop-daemon运行autossh时,pidfile中包含的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匹配?

1 个答案:

答案 0 :(得分:3)

我找到的解决方案受到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 不再需要
  • --pidfilestart-stop-daemon
  • sudo start-stop-daemon --pidfile /var/run/mytunnel.pid --stop现在可以杀死autossh
  • --background选项会使ssh -f成为可选项(如果使用-f,则使用--background或不会更改任何内容)< / LI>

这种行为的原因对我来说并不完全清楚。但是,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之后)。