diff --git a/core/tarantool.c b/core/tarantool.c
index 4a7f79c71f75da553a9a63715e7b1a45bb604533..44360431aa82da5138fd4a2076a62428d03fda41 100644
--- a/core/tarantool.c
+++ b/core/tarantool.c
@@ -221,6 +221,23 @@ initialize_minimal()
 	initialize(0.1, 4, 2);
 }
 
+static void
+print_usage(void)
+{
+	puts("usage:");
+	puts("	-h, --help");
+	puts("	-c, --config=filename");
+#ifdef STORAGE
+	puts("	--cat=filename");
+	puts("	--init_storage");
+#endif
+	puts("	-V, --version");
+	puts("	-p, --create_pid");
+	puts("	-v, --verbose");
+	puts("	-D, --daemonize");
+	puts("	--cfg_get=paramname");
+}
+
 int
 main(int argc, char **argv)
 {
@@ -238,8 +255,12 @@ main(int argc, char **argv)
 	stat_init();
 	palloc_init();
 
-	const char *short_opt = "c:pvVD";
+	const char *short_opt = "hc:pvVD";
 	const struct option long_opt[] = {
+		{.name = "help",
+		 .has_arg = 0,
+		 .flag = NULL,
+		 .val = 'h'},
 		{.name = "config",
 		 .has_arg = 1,
 		 .flag = NULL,
@@ -311,26 +332,15 @@ main(int argc, char **argv)
 			role = cfg_get;
 			cfg_paramname = strdup(optarg);
 			break;
+		case 'h':
+			print_usage();
+			return 0;
 		}
 	}
 
-	if (argc != optind)
-		panic("not all args were parsed");
-
-	if (role == usage) {
-		fprintf(stderr, "usage:\n");
-		fprintf(stderr, "	-c, --config=filename\n");
-#ifdef STORAGE
-		fprintf(stderr, "	--cat=filename\n");
-		fprintf(stderr, "	--init_storage\n");
-#endif
-		fprintf(stderr, "	-V, --version\n");
-		fprintf(stderr, "	-p, --create_pid\n");
-		fprintf(stderr, "	-v, --verbose\n");
-		fprintf(stderr, "	-D, --daemonize\n");
-		fprintf(stderr, "	--cfg_get=paramname\n");
-
-		return 0;
+	if (argc != optind) {
+		fprintf(stderr, "Can't parse command line: try --help or -h for help.\n");
+		exit(EX_USAGE);
 	}
 
 	if (cfg_filename[0] != '/') {