运行 expect 脚本后台节点

Running node in background from expect script

我正在尝试从 expect 脚本 运行 多个节点服务,因此为了 运行 它们一个接一个,我需要在后台 运行 它们。 运行 它在控制台中运行良好(进程已启动并在后台启动),例如:

>node /path/to/service1/myService1.js &> /var/log/myService1.log &
>node /path/to/service2/myService2.js &> /var/log/myService2.log &

但是 运行我的 expect 脚本,就像:

#!/usr/bin/expect

set customer_root_dir "/path"
set customer_app_dir "/to"
set services {"service1" "service2"}
set service_names {"myService1" "myService2"}


# Set the maximum match length
match_max [ expr 32 * 1024 ]

foreach service $services service_name $service_names {
    spawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js &> /var/log/$service_name.log &
    sleep 2
}

puts "All services are running!"

我看到它们不是在后台启动的。服务文件(例如 service1.js)之后的所有内容(例如 service1.js),我的意思是 &> /var/log/myService1.log &,都被忽略了!如果我输入类似 spawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js abracadabra 的内容,期望脚本会 运行 它就像 spawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js

我尝试了什么?

我该如何解决我的问题?

这应该有效:

set js  $customer_root_dir/$customer_app_dir/$service/$service_name.js
set log /var/log/$service_name.log

exec nohup node $js < /dev/null >& $log &

请注意,将 stdout 和 stderr 写入文件的 Tcl 重定向是 >&(参见 exec 手册页)。同时重定向所有 stdio 通道以断开与终端的连接。

spawn 不是正确的命令:您不需要与进程交互,所以只需 exec 它并忘记它。